summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Rules.mak10
-rw-r--r--ldso/ldso/powerpc/dl-startup.h8
2 files changed, 13 insertions, 5 deletions
diff --git a/Rules.mak b/Rules.mak
index 1dbd392b2..9d408d364 100644
--- a/Rules.mak
+++ b/Rules.mak
@@ -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