From owner-freebsd-questions@FreeBSD.ORG Wed Sep 29 20:55:22 2010 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 274D010656A9 for ; Wed, 29 Sep 2010 20:55:22 +0000 (UTC) (envelope-from bonomi@mail.r-bonomi.com) Received: from mail.r-bonomi.com (ns2.r-bonomi.com [204.87.227.129]) by mx1.freebsd.org (Postfix) with ESMTP id D71AD8FC1D for ; Wed, 29 Sep 2010 20:55:21 +0000 (UTC) Received: (from bonomi@localhost) by mail.r-bonomi.com (8.14.3/rdb1) id o8TKrMs4003936; Wed, 29 Sep 2010 15:53:22 -0500 (CDT) Date: Wed, 29 Sep 2010 15:53:22 -0500 (CDT) From: Robert Bonomi Message-ID: <201009292053.o8TKrMs4003936@mail.r-bonomi.com> To: talon@lpthe.jussieu.fr Cc: freebsd-questions@freebsd.org Subject: Re: ld(1) cannot find entry symbol _start; X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 29 Sep 2010 20:55:22 -0000 > From owner-freebsd-questions@freebsd.org Wed Sep 29 05:50:13 2010 > Date: Wed, 29 Sep 2010 11:51:09 +0100 (BST) > From: Anton Shterenlikht > To: Michel Talon > Cc: freebsd-questions@freebsd.org > Subject: Re: ld(1) cannot find entry symbol _start; > > > > On Tue, 28 Sep 2010, Michel Talon wrote: > > > Paul B Mahol said: > > On 9/28/10, Anton Shterenlikht 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. > > thank you. Where can I read more on what each file is for: > > % ls -al /usr/lib/crt* > -r--r--r-- 1 root wheel 2552 Sep 15 13:52 /usr/lib/crt1.o > -r--r--r-- 1 root wheel 4656 Sep 15 13:53 /usr/lib/crtbegin.o > -r--r--r-- 1 root wheel 4936 Sep 15 13:53 /usr/lib/crtbeginS.o > -r--r--r-- 1 root wheel 4656 Sep 15 13:53 /usr/lib/crtbeginT.o > -r--r--r-- 1 root wheel 3648 Sep 15 13:53 /usr/lib/crtend.o > -r--r--r-- 1 root wheel 3648 Sep 15 13:53 /usr/lib/crtendS.o > -r--r--r-- 1 root wheel 1928 Sep 15 13:52 /usr/lib/crti.o > -r--r--r-- 1 root wheel 1087 Sep 15 13:52 /usr/lib/crtn.o > > The sources for these files are in asm, so would be good > to read a more accessible introduction. Those routines set up the "run-time envrionment" that any UNIX c-language evironment expects. that's that the name 'crt' prefix means '-language un-ime' this involves a bunch of 'gory mechanical details' that *DON'T* really matter how they get accomplished, jus that they _do_ get done. This includes things like setting up the 'stack', and the 'heap', initializing the tables for the dynamic-memory management routines (malloc and friends), setting up 'stdin/stdout/stderr', and getting the command-line arguments processed so that they can be passed as 'argc', and 'argv' (also the 'environment', in 'envp') to your 'main()' program. > > Also, it seems only crt1, crti and crtn are provided > by FreeBSD itself (/usr/src/lib/csu/ia64), crtbegin and > crtend are under /usr/src/contrib/gcc/config/ia64/, > and sources for *S.o and *T.o I can't find at all. > So which of these are specific to GCC on FreeBSD, and > which aren't? "who cares?" applies. it is all simmply "required housekeeping" go bring the state of the current running process (i.e, the task/ address-space/etc) to what is defined as the 'initial state' for a c-language 'main()' program. > > For example if I use g95 compiler instead of gfortran45, > will the linker still need all above object files? If you use 'the compiler' to manage the linking process -- e.g. {compilername} -o {executable} {one-or-more-'object' .o file} the right files will be automatically included in the executable. 'crt0.o' is the classical program entry point -- it may or may not rely on other routines to get 'the environment' set up -- especially depending on what 'advanced' features the program uses.. If you use light-weight-process 'threads' (-lpthread) this may call for different crt0 code. Unless you are engaged in porting the compiler and O/S to a completely new hardware architecture, or trying to generate 'stand-alone' code, e.g. for an embedded processor tht runs witout _anuting called a 'cpu', you don't have any reason to worry about this housekeeping code. Its there, it works, and it does what it's supposed to. Oh yeah, if you tamper with it, you make it incompatible with the use of _any_ existing object files.