diff options
-rw-r--r-- | Rules.mak | 10 | ||||
-rw-r--r-- | ldso/ldso/powerpc/dl-startup.h | 8 |
2 files changed, 13 insertions, 5 deletions
@@ -88,7 +88,15 @@ export RUNTIME_PREFIX DEVEL_PREFIX ARFLAGS:=r OPTIMIZATION:= -PICFLAG:=-fPIC + +# PowerPC can hold 8192 entries in its GOT with -fpic which is more than enough. Therefore use +# -fpic which will reduce code size and generates faster code. +ifeq ($(strip $(TARGET_ARCH)),powerpc) + PICFLAG:=-fpic +else + PICFLAG:=-fPIC +endif + # Some nice CPU specific optimizations ifeq ($(strip $(TARGET_ARCH)),i386) OPTIMIZATION+=$(call check_gcc,-mpreferred-stack-boundary=2,) diff --git a/ldso/ldso/powerpc/dl-startup.h b/ldso/ldso/powerpc/dl-startup.h index 5d8073ccf..f8e14e0ba 100644 --- a/ldso/ldso/powerpc/dl-startup.h +++ b/ldso/ldso/powerpc/dl-startup.h @@ -38,15 +38,15 @@ asm("" \ Elf32_Addr finaladdr=(SYMBOL)+(RELP)->r_addend;\ if (type==R_PPC_RELATIVE) { \ *REL=(Elf32_Word)(LOAD)+(RELP)->r_addend;\ + } else if (type==R_PPC_ADDR32 || type==R_PPC_GLOB_DAT) {\ + *REL=finaladdr; \ } else if (type==R_PPC_JMP_SLOT) { \ Elf32_Sword delta=finaladdr-(Elf32_Word)(REL);\ *REL=OPCODE_B(delta); \ - } else if (type==R_PPC_ADDR32) { \ - *REL=finaladdr; \ + PPC_DCBST(REL); PPC_SYNC; PPC_ICBI(REL);\ } else { \ - _dl_exit(100+ELF32_R_TYPE((RELP)->r_info)); \ + _dl_exit(100+ELF32_R_TYPE((RELP)->r_info));\ } \ - PPC_DCBST(REL); PPC_SYNC; PPC_ICBI(REL); \ } /* * Transfer control to the user's application, once the dynamic loader |