Gold linker: specify alignment of sections

Martin Richtarsky ml@martinien.de
Mon Aug 5 13:47:00 GMT 2013


 Ian Lance Taylor <iant@google.com> wrote:
> On Wed, Jul 31, 2013 at 10:30 AM, Martin Richtarsky <ml@martinien.de> 
> wrote:
>>
>> E.g. include the script in rpath-link and also pass it as one of
>> the object files. This is an implicit linker script as described 
>> here:
>>
>> 
>> http://sourceware.org/binutils/docs-2.23.1/ld/Implicit-Linker-Scripts.html#Implicit-Linker-Scripts
>>
>>
>> Now, when linking in the same way using gold 2.23.1, the
>> script is rejected with this error:
>>
>> " LinkerScript.ld: SECTIONS seen after other input files;
>>   try -T/--script"
>>
>> So gold wants me to specify a complete linker script, however I
>> only want to change a couple attributes. Is this possible?
>
> You won't get that error if you put your implicit linker script 
> first.
>
> However, I agree that its complex to specify a SECTIONS clause that
> does not describe what to do with all sections.  Does that really 
> work
> with GNU ld?  As the docs say, an implicit linker script normally 
> only
> includes symbol assignments and INPUT commands and the like.  I
> suspect that your implicit linker script is overriding the default
> SECTIONS clause, with results that may be hard to understand.
>
>> - Passing the script with the -T option. This produces a broken
>>   executable that fails to start. As I understand this is because
>>   -T only accepts complete linker scripts, while the above is
>>   just an implicit linker script.
>
> You didn't really say that the target is.  If this is a GNU/Linux
> system, then you probably don't need much to get it working.

 My target is GNU/Linux x86_64. When I am using the complete linker 
 script,
 I get a crash here:

 #0  0x0000000000403770 in cxa_throw_notify_local ()
 #1  0x0000000000400f3e in call_gmon_start ()
 #2  0x00007fffffff86f8 in ?? ()
 #3  0x0000000000400df1 in _init ()
 #4  0x00002aaaabec7aa0 in ?? () from /lib64/libc.so.6
 #5  0x00000000004017d5 in __libc_csu_init (argc=1, argv=0x7fffffff86f8, 
 envp=0x7fffffff8708)
     at elf-init.c:120
 #6  0x00002aaaabed6b52 in __libc_start_main () from /lib64/libc.so.6
 #7  0x0000000000400f29 in _start () at 
 ../sysdeps/x86_64/elf/start.S:113



 cxa_throw_notify_local is a globally visible function pointer that is 
 initialized
 to point to another function at startup. Any section I am missing here 
 in my
 linker script? (attached)

 .gnu.hash
 init_array
 .ldata

 Comparing readelf --sections, the gold executable has the same sections 
 as the ld
 except for ".gnu.hash" and two additional: .init_array and .ldata

>> - So I have tried obtaining a complete linker script. "ld --verbose"
>>   will print the default linker script. I had to remove a couple
>>   of symbols that were not understood by gold, afterwards the 
>> executable
>>   produced with the "-T/path/to/LinkerScript.ld" option didn't work 
>> anymore.
>
> That may be a bug in gold.
>
> Since all you want to do is set the alignment of the output section,
> and the alignment of an output section is determined by the maximum
> alignment of all input sections, I suspect you can get the results 
> you
> want by including a little assembler file in your link, something 
> like
>
>     .text
>     .balign 0x40
>     .data
>     .balign 0x40
>
> Although I admit I'm not sure offhand whether you can set the
> alignment of .plt this way.  But then I'm pretty sure you can't set
> the alignment of .plt with a linker script anyhow.

 I tried it and it worked as far as alignment goes, but it leads to
 crashes when changing the alignment for .got, .plt or .got.plt:

 (gdb) bt
 #0  0x00002aaaaaab66f8 in _dl_relocate_object () from 
 /lib64/ld-linux-x86-64.so.2
 #1  0x00002aaaaaaae95e in dl_main () from /lib64/ld-linux-x86-64.so.2
 #2  0x00002aaaaaabf97a in _dl_sysdep_start () from 
 /lib64/ld-linux-x86-64.so.2
 #3  0x00002aaaaaaac3d1 in _dl_start () from /lib64/ld-linux-x86-64.so.2
 #4  0x00002aaaaaaabb08 in _start () from /lib64/ld-linux-x86-64.so.2
 #5  0x0000000000000002 in ?? ()
 #6  0x00007fffffff9377 in ?? ()
 #7  0x00007fffffff939f in ?? ()
 #8  0x0000000000000000 in ?? ()


 Changing the alignment using the original SECTIONS script together with 
 ld works,
 the alignment is correct and the executables are running.


 Best regards,
 Martin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: LinkerScriptGold.ld
Type: text/x-c
Size: 8569 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20130805/c659caa1/attachment.bin>


More information about the Binutils mailing list