Undetected duplicate symbols

Khem Raj khem@mvista.com
Wed Feb 8 20:45:00 GMT 2006


Marius Groeger said the following on 02/08/2006 01:49 AM:
> On Tue, 7 Feb 2006, Khem Raj wrote:
>
>> Do you have your own linker script file ? or do you use default one. 
>> I think you need to have your own for the system
>> either way you can remove the symbol for linker script and see if 
>> that works. Would be nice if you could make a short example to 
>> exhibit the problem.
>
> Sure, see below.
>
> Writing this example I found the issue not only happens with my MIPS
> toolchain, but also with my host gcc. Most convincing is the 
> disassembly; it
> clearly shows that the _start which I defined as entry point is has been
> lost. Maybe it's a "feature" that linker script variables override
> application variables, but don't think I like this feature then...
>
> sh# gcc -c -o duplicate.o duplicate.c
> sh# ld -o duplicate -T duplicate-ld duplicate.o
> sh# nm duplicate
> 00000000 T dummy
> 00000000 T _start
> mag@mag:~/work> nm duplicate.o
> 00000000 T dummy
> 00000025 T _start
> mag@mag:~/work> objdump -d duplicate
>
> duplicate: file format elf32-i386
>
> Disassembly of section .text:
>
> 00000000 <_start>:
> 0: 55 push %ebp
> 1: 89 e5 mov %esp,%ebp
> 3: 83 ec 04 sub $0x4,%esp
> 6: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)
> d: 8b 45 fc mov 0xfffffffc(%ebp),%eax
> 10: 83 f8 63 cmp $0x63,%eax
> 13: 7e 02 jle 17 <_start+0x17>
> 15: eb 09 jmp 20 <_start+0x20>
> 17: 8b 45 fc mov 0xfffffffc(%ebp),%eax
> 1a: 40 inc %eax
> 1b: 89 45 fc mov %eax,0xfffffffc(%ebp)
> 1e: eb ed jmp d <_start+0xd>
> 20: 8b 45 fc mov 0xfffffffc(%ebp),%eax
> 23: c9 leave
> 24: c3 ret
> 25: 55 push %ebp
> 26: 89 e5 mov %esp,%ebp
> 28: 83 ec 08 sub $0x8,%esp
> 2b: c7 45 fc 00 00 0c bf movl $0xbf0c0000,0xfffffffc(%ebp)
> 32: e8 c9 ff ff ff call 0 <_start>
> 37: 89 c2 mov %eax,%edx
> 39: 8b 45 fc mov 0xfffffffc(%ebp),%eax
> 3c: 89 10 mov %edx,(%eax)
> 3e: c9 leave
> 3f: c3 ret
>
>
>
> Sampel application "duplicate.c":
> extern int dummy(void)
> {
> volatile int i;
>
> /* create some .text data to move _start away from the beginning */
>
> for(i = 0; i < 100; i++)
> ;
>
> return i;
> }
>
> extern void _start(void)
> {
> volatile int *p = (volatile int*)0xbf0c0000;
>
> *p = dummy();
> }
>
> Linker script "duplicate-ld":
> SECTIONS
> {
> .text 0x00000000:
> {
> _start = . ;
> *(.text)
> }
> }
>
> Marius
>
This is a bug in ld I think. I filed one in binutils bugzilla #2300

------
Want more information?  See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sourceware.org



More information about the crossgcc mailing list