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