[LLVMdev] [lld] ELF weak aliases
bigcheesegs at gmail.com
Wed Jan 9 04:48:15 PST 2013
On Tue, Jan 8, 2013 at 8:56 PM, <shankare at codeaurora.org> wrote:
> Hi Michael,
> Does ELF support aliasing ?
> How is the relationship captured in ELF symbol table, that one symbol is a
> alias of another symbol ?
It is not explicitly captured. It's an implicit relationship due to
the symbols having the same address.
>> Note that __stdout_used is the last symbol in the .rodata section.
>> This means that the reader assigns the data (16 bytes of 0) to
>> __stdout_used. Because dummy_file and the other __stdx_used symbols
>> come before it, they end up in the right place in the final file.
> Did you change the Reader too ?
No. I just made another symbol to steal the actual content.
> The Reader doesnot allocate any space for __stdout_used. The size of the
> current symbol = (value of next symbol - current symbol). In this case its
__stdout_used is the last symbol at that address, so it gets the data.
The hack was to make __stdout_used not get the data.
>> This works great until another object file provides a definition of
>> __stdout_used. The weak definition of it gets totally removed, meaning
>> so does the content for the other __stdx_used symbols.
> When the other object provides a definition for __stdout_used, the atom
> gets the property of the other object which defines the atom isnt it, and
> so as the ordinal too riht ?
> Couldnt follow how did the others move ?
I'm not quite sure what you mean here.
> This is what I see with binutils/ld :-
> $cat 1.c
> #include "stdio_impl.h"
> static FILE *const dummy_file = 0;
> weak_alias(dummy_file, __stdin_used);
> weak_alias(dummy_file, __stdout_used);
> weak_alias(dummy_file, __stderr_used);
> $cat 2.c
> int __stdout_used = 10;
> $readelf -s 1.o | grep -E 'used|dummy_file'
> 6: 0000000000000000 8 OBJECT LOCAL DEFAULT 4 dummy_file
> 9: 0000000000000000 8 OBJECT WEAK DEFAULT 4 __stdin_used
> 10: 0000000000000000 8 OBJECT WEAK DEFAULT 4 __stdout_used
> 11: 0000000000000000 8 OBJECT WEAK DEFAULT 4 __stderr_used
> $readelf -s 2.o | grep -E 'used|dummy_file'
> 7: 0000000000000000 4 OBJECT GLOBAL DEFAULT 2 __stdout_used
> $ld 1.o 2.o
> ld: warning: cannot find entry symbol _start; defaulting to 00000000004000e8
> $readelf -s a.out | grep -E 'used|dummy_file'
> 5: 00000000004000e8 8 OBJECT LOCAL DEFAULT 1 dummy_file
> 7: 00000000006000f0 4 OBJECT GLOBAL DEFAULT 2 __stdout_used
> 8: 00000000004000e8 8 OBJECT WEAK DEFAULT 1 __stdin_used
> 13: 00000000004000e8 8 OBJECT WEAK DEFAULT 1 __stderr_used
> Shankar Easwaran
Yes, which is what we want. Currently we get a dummy_file,
__stdin_used, __stderr_used all as 0 size.
- Michael Spencer
More information about the llvm-dev