[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-libc-dev] getting a short interrupt vector table

From: Joerg Wunsch
Subject: Re: [avr-libc-dev] getting a short interrupt vector table
Date: Tue, 7 Feb 2012 08:16:05 +0100
User-agent: Mutt/1.5.20 (2009-06-14)

As Bill Westfield wrote:

> However, if I link
> with "-nostartfiles" I seem to get the desired behavior.

That's what you are supposed to do, yes.

> How is the crtxxx file linked into the final target?  In order for the
> weak symbol to be overridden by my own definition, it would have to be
> treated as a library, and should come "after" my code, right?

No, the crt*.o file is explicitly linked as the very first object file
on the linker commandline.  You can watch this by adding -v to the
compiler commandline.

When thinking about it, it probably doesn't make sense to declare it
weak in the library, as there's no way around using -nostartfiles, but
then, the (non-weak) vector table from crt*.o isn't in the way anyway.

I don't know whether it would be possible to move the crt*.o file into
a library at all (*), at least historically, it's never been the case.
For example, on my host system, it looks like:

$ echo 'int main(void) { return 42; }' > foo.c
$ cc -v -o foo foo.c
Using built-in specs.
Target: i386-undermydesk-freebsd
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 4.2.1 20070719  [FreeBSD]
 /usr/libexec/cc1 -quiet -v -D_LONGLONG foo.c -quiet -dumpbase foo.c -auxbase 
foo -version -o /var/tmp//ccOUXd5v.s
ignoring duplicate directory "/usr/include"
#include "..." search starts here:
#include <...> search starts here:
End of search list.
GNU C version 4.2.1 20070719  [FreeBSD] (i386-undermydesk-freebsd)
        compiled by GNU C version 4.2.1 20070719  [FreeBSD].
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 6b6f6bc30816b118527ed697984d7f28
 /usr/bin/as -o /var/tmp//cchKS1Jl.o /var/tmp//ccOUXd5v.s
 /usr/bin/ld --eh-frame-hdr -V -dynamic-linker /libexec/ld-elf.so.1 -o foo 
/usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/lib -L/usr/lib 
/var/tmp//cchKS1Jl.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
GNU ld version 2.15 [FreeBSD] 2004-05-23
  Supported emulations:

As you can see, /usr/lib/crt1.o is the very first file on the linker
commandline, too.

(*) If at all, it would require per-device libraries, and GCC has to
know about that.

In order for crt*.o to be pulled from a library, there has to be a
"pre-undefined" symbol that would cause the linker to consider that
file at all.  Adding such a symbol would be another compiler driver
cheers, J"org               .-.-.   --... ...--   -.. .  DL8DTL

http://www.sax.de/~joerg/                        NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]