Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Sep 2010 13:54:14 +0000
From:      Michel Talon <talon@lpthe.jussieu.fr>
To:        freebsd-questions@freebsd.org
Subject:   Re: ld(1) cannot find entry symbol _start;
Message-ID:  <20100928135414.GA17159@lpthe.jussieu.fr>

next in thread | raw e-mail | index | archive | help
Paul B Mahol said:
On 9/28/10, Anton Shterenlikht <mexas@bristol.ac.uk> wrote:
> > I'm trying to learn the very basics of the
> > compile - assemble - link process on FreeBSD.
> > Please don't shoot me.
> ....
> > Then I try to link the object file into
> > an executable:
> >
> > % ld tmp.o
> 
> You are missing something in above command.
> 

More precisely, if you run gcc -v on a C file you get someting like:
 /usr/bin/ld --eh-frame-hdr -V -dynamic-linker /libexec/ld-elf.so.1
/usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/lib
-L/usr/lib /var/tmp//cco5EINk.o -lgcc --as-needed -lgcc_s --no-as-needed
-lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/crtend.o
/usr/lib/crtn.o


where the object file produced by compilation and assembling is 
/var/tmp//cco5EINk.o 

That is adds several other object files to your own in order to get 
an executable.

In particular the start symbol, at which execution begins is in 
/usr/lib/crt1.o

as you can see from
niobe% nm /usr/lib/crt1.o
         w _DYNAMIC
00000000 D __progname
         U _fini
         U _init
         U _init_tls
00000000 T _start
00000020 t _start1
00000000 r abitag
         U atexit
00000004 C environ
         U exit
         U main
which shows that _start is defined here, (but not e.g. _init). On the
other hand the function main() which is defined in your program is 
referred to but undefined here.


-- 

Michel TALON




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100928135414.GA17159>