caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: skaller <skaller@users.sourceforge.net>
To: Jonathan Roewen <jonathan.roewen@gmail.com>
Cc: caml-list@yquem.inria.fr
Subject: Re: [Caml-list] bytecode apps without stdlib/pervasives
Date: Wed, 16 Nov 2005 12:55:02 +1100	[thread overview]
Message-ID: <1132106102.9002.50.camel@rosella> (raw)
In-Reply-To: <ad8cfe7e0511151445y40659b7ge191698147f30f59@mail.gmail.com>

On Wed, 2005-11-16 at 11:45 +1300, Jonathan Roewen wrote:
> Hi,
> 
> I have a simple ML file (test.ml):
> 
> 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 test.ml, 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:

/usr/lib/gcc/x86_64-linux-gnu/4.0.2/crtbegin.o
/usr/lib/gcc/x86_64-linux-gnu/4.0.2/crtbeginS.o
/usr/lib/gcc/x86_64-linux-gnu/4.0.2/crtbeginT.o
/usr/lib/gcc/x86_64-linux-gnu/4.0.2/crtend.o
/usr/lib/gcc/x86_64-linux-gnu/4.0.2/crtendS.o

/usr/lib/crt1.o
/usr/lib/crti.o
/usr/lib/crtn.o
/usr/lib/gcrt1.o
/usr/lib/Mcrt1.o
/usr/lib/Scrt1.o

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:

OPTIONS
       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++: http://felix.sf.net


  reply	other threads:[~2005-11-16  1:55 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-11-15 22:45 Jonathan Roewen
2005-11-16  1:55 ` skaller [this message]
2005-11-17 16:15 ` Damien Doligez

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1132106102.9002.50.camel@rosella \
    --to=skaller@users.sourceforge.net \
    --cc=caml-list@yquem.inria.fr \
    --cc=jonathan.roewen@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).