Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
[Caml-list] bytecode apps without stdlib/pervasives
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2005-11-16 (01:55)
From: skaller <skaller@u...>
Subject: Re: [Caml-list] bytecode apps without stdlib/pervasives
On Wed, 2005-11-16 at 11:45 +1300, Jonathan Roewen wrote:
> Hi,
> I have a simple ML file (
> external raise : exn -> 'a = "%raise";;
> raise End_of_file;;
> so I can check how the compiler does things (like if predefined ocaml
> symbols are still present without stdlib present), and compile as:
> ocamlc -nostdlib -nopervasives, which generates a.out.
> when I run it, I get error: "-bash: ./a.out: cannot execute binary
> file" (btw, generates expected behabiour without those flags)
> why can't it execute it? can we only use -nostdlib as long as we
> provide our own pervasives module?

You need to link in the C startup code manually, and pass whatever
flags are need to the linker to tell it how to make an executable.
My system has:



here you can see the unresolved external 'main':

skaller@rosella:/work/felix/flx$ nm /usr/lib/crt1.o
0000000000000000 D __data_start
0000000000000000 W data_start
0000000000000000 R _IO_stdin_used
                 U __libc_csu_fini
                 U __libc_csu_init
                 U __libc_start_main
                 U main
0000000000000000 T _start

Exactly how the linker 'marks' a generated binary 'executable'
I don't know -- just linking in the startup/termination
code may not be enough.

>From my ld manpage:

       The linker supports a plethora of command-line options,  but
       in  actual  practice  few of them are used in any particular
       context.  For instance, a frequent use  of  ld  is  to  link
       standard  Unix  object  files  on a standard, supported Unix
       system.  On such a system, to link a file "hello.o":

               ld -o <output> /lib/crt0.o hello.o -lc

       This tells ld to produce a file called output as the  result
       of  linking  the  file  "/lib/crt0.o" with "hello.o" and the
       library "libc.a", which will come from the  standard  search
       directories.  (See the discussion of the -l option below.)

Note of course all this is for starting up C or C++ programs.
How Ocaml works is a mystery .. :)

John Skaller <skaller at users dot sf dot net>
Felix, successor to C++: