[U-Boot] [PATCH 1/1] spl: u-boot-spl-nodtb.bin: remove .got and .got.plt sections

Heinrich Schuchardt xypron.glpk at gmx.de
Tue Sep 12 00:50:54 UTC 2017


On 09/12/2017 01:19 AM, Dr. Philipp Tomsich wrote:
>> On 12 Sep 2017, at 00:40, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>>
>> For qemu-x86_64_defconfig on Debian Stretch
>> ld 2.28 creates a .got and a .got.plt section in
>> u-boot-spl.
>>
>> If we do not ignore these sections objcopy generates an
>> u-boot-spl-nodtb.bin file of 4 GiB which leads to
>> subsequent failure of the build process.
>>
>> According to
>> https://sourceware.org/bugzilla/show_bug.cgi?id=22120#c2
>> objcopy can not generate files with holes.
>>
>> With the patch we can run qemu with the generated u-boot.rom.
>>
>> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>> ---
>> I ran the Travis CI tests with no error reported:
>> https://travis-ci.org/xypron2/u-boot/builds/274042004
>>
>> It is unclear to me why on Debian Stretch the .got and .got.plt sections
>> are generated. The problem does not exist on Debian Jessie which uses
>> binutils 2.25.
>>
>> I found this comment in the BFD code which describes under which
>> circumstances the .got.plt section is not generated:
>>
>> https://sourceware.org/viewvc/src/bfd/elf64-x86-64.c?view=markup#l2921
>>
>> Don't allocate .got.plt section if there are no GOT nor PLT
>> entries and there is no reference to _GLOBAL_OFFSET_TABLE_.
>> ---
>> scripts/Makefile.spl | 3 ++-
>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl
>> index dd8065d87d..3b2d79d562 100644
>> --- a/scripts/Makefile.spl
>> +++ b/scripts/Makefile.spl
>> @@ -286,7 +286,8 @@ quiet_cmd_objcopy = OBJCOPY $@
>> cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
>>
>> OBJCOPYFLAGS_$(SPL_BIN)-nodtb.bin = $(SPL_OBJCFLAGS) -O binary \
>> -		$(if $(CONFIG_SPL_X86_16BIT_INIT),-R .start16 -R .resetvec)
>> +		$(if $(CONFIG_SPL_X86_16BIT_INIT), \
>> +		-R .start16 -R .resetvec -R .got -R .got.plt)
> 
> If there is a non-empty .got, it can not be safely removed. The remaining code
> can (and will) reference data within the .got.
> Did you check the contents of the .got and where these are referenced from?

This is from spl/u-boot-spl.map:

.text           0x00000000fffd0000     0xa032
 *(.text*)
 .text          0x00000000fffd0000       0xcc arch/x86/cpu/start.o
                0x00000000fffd0000                _x86boot_start
                0x00000000fffd0020                _start

.got            0x0000000000120000        0x4
 .got           0x0000000000120000        0x4 arch/x86/cpu/start.o

.got.plt        0x0000000000120004        0xc
 .got.plt       0x0000000000120004        0xc arch/x86/cpu/start.o
                0x0000000000120004                _GLOBAL_OFFSET_TABLE_

So in .got there is just the reference to the BIOS start address.
And .got.plt contains additionally a pointer to .got.

> Did you check the contents of the .got and where these are referenced
> from?
It is unclear to me what additional information is needed and how it can
be extracted.

Regards

Heinrich

> 
>>
>> $(obj)/$(SPL_BIN)-nodtb.bin: $(obj)/$(SPL_BIN) FORCE
>> 	$(call if_changed,objcopy)
>> -- 
>> 2.11.0
>>
> 
> 



More information about the U-Boot mailing list