From: Markus Mottl <email@example.com>
Subject: Re: Sys.argv with interpreter and compiler
Date: Mon, 5 Jul 1999 11:37:25 +0100 (MET DST)
In-Reply-To: <19990705100950.A3414@maxime.u-strasbg.fr> from "Sven LUTHER" at Jul 5, 99 10:09:50 am
> I don't get the same, why :
> sh-2.02$ cat essay
> print_string "Hello world!"; print_newline();;
> exit 0;;
> sh-2.02$ ./essai
> ./essai: line 2: syntax error near unexpected token `;'
> ./essai: line 2: `print_string "Hello world!"; print_newline();;'
Your toplevel "/usr/local/bin/ocaml" is obviously compiled to byte code.
Take a look at it with "less" and you will see that the first line of
this executable is actually "#!/home/mottl/mysys/bin/ocamlrun".
As far as I know it is not allowed on any unix system to run scripts
whose interpreter is a script itself. This would make it much easier to
replace this interpreter with something evil - e.g. some kind of wrapper
that executes unfriendly commands under you UID and continues with the
Try the difference like this:
ocamlmktop -o newtop
Now place replace "#!/usr/local/bin/ocaml" with the path to the newly
created "newtop" and run "essay" again - you will again receive an error
message, because the system will run the script with your current shell
instead with "newtop" which is not a "true" binary.
ocamlmktop -custom newtop
This will generate a native code (=true binary) toplevel. You might
want to link useful native code libraries to it, eg. "unix", "str", even
"threads" and graphics work just fine!
If you run "essay" again, it will work out of the box...
I have linked my own "toplevel" like this (under Linux -> native threads
ocamlmktop -thread -custom -o mocaml \
graphics.cma -cclib -lgraphics -ccopt -L/usr/X11R6/lib -cclib -lX11 \
unix.cma -cclib -lunix \
str.cma -cclib -lstr \
threads.cma -cclib -lthreads -cclib -lunix -cclib -lpthread
This allows me to run virtually every kind of Ocaml-script from the shell.
Try "mocaml" with this little program under X-windows:
let main () =
let sx, sy = size_x (), size_y () in
let maxr = min (sx lsr 2) (sy lsr 2) and maxc = 256 in
while not (key_pressed ()) do
let x, y, r, color = int sx, int sy, int maxr,
rgb (int maxc) (int maxc) (int maxc) in
set_color color; fill_circle x y r
let _ = Printexc.catch main ()
-- Markus Mottl, firstname.lastname@example.org, http://miss.wu-wien.ac.at/~mottl
This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:23 MET