
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