[U-Boot-Users] [PATCH] Off-by-two bug when relocating GOT

Shinya Kuribayashi skuribay at ruby.dti.ne.jp
Sun Oct 14 17:57:53 CEST 2007


Vlad Lungu wrote:
>>   +       .got : {
>>   +               _gp = .;
>>   +               __got_start = .;
>>   +               *(.got)
>>   +               __got_end = .;
>>   +       }
> [snip]
> That doesn't look right.  Don't put _gp inside .got section.

Agreed, will fix.

>>> One more point: loading  $gp with _GLOBAL_OFFSET_TABLE_ is not a 
>>> good  idea, it should be loaded with _gp. The value
>>>     is the same at the moment, but it's not guaranteed at all, 
>>> someone could start playing with the link scripts and break this.
>>>     
>> Hmm, I have to consider more.

Thanks for your comment. Now investigating further, so I need some time.

> Here's a good example:
> 
> http://www.sourceware.org/ml/ecos-discuss/2004-02/msg00327.html
> 
> There are some sections (.sdata/.sbss/.scommon)  that contain objects 
> referenced via $gp and not via GOT.
> 
> Try nm -n -f sysv u-boot|grep scommon.

This is caused by lacking of -G0 in PLATFORM_LDFLAGS. I'm preparing a
patch as below, and will submit for review in the near future.

diff --git a/mips_config.mk b/mips_config.mk
index d8aa5fa..93324ad 100644
--- a/mips_config.mk
+++ b/mips_config.mk
@@ -22,3 +22,36 @@
 #
 
 PLATFORM_CPPFLAGS += -DCONFIG_MIPS -D__MIPS__
+
+#
+# GCC uses -G 0 -mabicalls -fpic as default.  We don't want PIC in the kernel
+# code since it only slows down the whole thing.  At some point we might make
+# use of global pointer optimizations but their use of $28 conflicts with
+# the current pointer optimization.
+#
+# The DECStation requires an ECOFF kernel for remote booting, other MIPS
+# machines may also.  Since BFD is incredibly buggy with respect to
+# crossformat linking we rely on the elf2ecoff tool for format conversion.
+#
+#cflags-y			+= -G 0 -mno-abicalls -fno-pic -pipe
+#cflags-y			+= -msoft-float
+#LDFLAGS_vmlinux			+= -G 0 -static -n -nostdlib
+#MODFLAGS			+= -mlong-calls
+#
+# But we U-Boot rely on PIC and need abicalls for now.
+#
+PLATFORM_CPPFLAGS		+= -G 0 -mabicalls -fpic -pipe
+PLATFORM_CPPFLAGS		+= -msoft-float
+PLATFORM_LDFLAGS		+= -G 0 -static -n -nostdlib
+
+PLATFORM_CPPFLAGS += -ffreestanding
+

According to mail archives of binutils, linux-mips, etc., GCC for MIPS
uses -G 0 as default, but ld does not. If calling ld directly, you need
to pass -G 0 explicitly like Linux. As a result, we'll get no small data.

That's all for now.

thanks,

    Shinya





More information about the U-Boot mailing list