diff options
author | Eric Andersen <andersen@codepoet.org> | 2004-08-06 16:11:43 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2004-08-06 16:11:43 +0000 |
commit | 4efa075cf3b7d772bcb1b82d175dd6ddb0cd29c5 (patch) | |
tree | 30f2047dbed293d4b7d25aa2f15a93aa01800a93 | |
parent | df1496fd55deb8df8a1f5d8534854190dfa75a3b (diff) |
Joakim Tjernlund writes:
This patch makes -fpic work for PCC and optimzes the relcation by moving the cache
flushing stuff to JMP relocs only. Actually PPCs ldso can only handle small
GOT tables(<=8192 entries)anyhow, so it makes little sense to compile PPC with -fPIC.
libuClibc shrunk from 340724 to 330780 bytes with -fpic.
-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 |