[PATCH] change the condition preventing symbol replacement in snapshot_symbol()
H.J. Lu
hjl.tools@gmail.com
Mon Jul 27 18:50:00 GMT 2009
On Mon, Jul 27, 2009 at 10:33 AM, H.J. Lu<hjl.tools@gmail.com> wrote:
>> I extended H.J.'s demonstration slightly:
>>
>> bar = foo
>> baz = globule
>>
>> .globl foo
>> .globl globule
>> foo:
>> jmp bar
>> jmp foo
>> jmp baz
>> jmp globule
>>
>> Which when assembled and dumped with objdump -dr gives:
>>
>> 00000000 <foo>:
>> 0: eb fe jmp 0 <foo>
>> 2: e9 fc ff ff ff jmp 3 <foo+0x3>
>> 3: R_386_PC32 foo
>> 7: e9 fc ff ff ff jmp 8 <foo+0x8>
>> 8: R_386_PC32 globule
>> c: e9 fc ff ff ff jmp d <foo+0xd>
>> d: R_386_PC32 globule
>>
>> The first jmp just seems plain wrong to me. I would expect it to have a
>> relocation against the foo symbol just like all of the others.
>
> That is a bug. I will look into it.
>
That isn't a bug. The reasons are
1. foo is defined and global.
2. bar is defined and local, which has the same type and value as foo.
3. baz is undefined, which has has the same type and value as globule.
4. globule is undefined.
The real bug is
[hjl@gnu-6 tmp]$ cat b.s
bar = foo
baz = globule
.hidden baz
.globl foo
.globl globule
foo:
jmp bar
jmp foo
jmp baz
jmp globule
[hjl@gnu-6 tmp]$ gcc -c b.s
[hjl@gnu-6 tmp]$ objdump -dr b.o
b.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <foo>:
0: eb fe jmp 0 <foo>
2: e9 00 00 00 00 jmpq 7 <foo+0x7>
3: R_X86_64_PC32 foo-0x4
7: e9 00 00 00 00 jmpq c <foo+0xc>
8: R_X86_64_PC32 globule-0x4
c: e9 00 00 00 00 jmpq 11 <foo+0x11>
d: R_X86_64_PC32 globule-0x4
[hjl@gnu-6 tmp]$
Now baz shouldn't be an alias of globule since it should be hidden.
--
H.J.
More information about the Binutils
mailing list