From mboxrd@z Thu Jan 1 00:00:00 1970 From: Shinya Kuribayashi Date: Mon, 15 Oct 2007 00:57:53 +0900 Subject: [U-Boot-Users] [PATCH] Off-by-two bug when relocating GOT In-Reply-To: <470E9E70.7060508@comsys.ro> References: <470526A4.40903@comsys.ro> <4705B65A.5040206@necel.com> <47061468.5050709@comsys.ro> <47069C03.4070505@corelatus.se> <4706BB27.5050108@comsys.ro> <470E81C4.8080908@ruby.dti.ne.jp> <470E9E70.7060508@comsys.ro> Message-ID: <47123C81.6050902@ruby.dti.ne.jp> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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