diff options
author | Nick Kralevich <nnk@google.com> | 2012-05-31 11:40:10 -0700 |
---|---|---|
committer | Nick Kralevich <nnk@google.com> | 2012-06-01 14:41:27 -0700 |
commit | 9d40326830c2bd407427889c554adeb915ee6b4a (patch) | |
tree | 17c901c0eb9768711be1c299178cbd891624281b /libc/Android.mk | |
parent | 857fc9eab912fbb3f27913c3582ed2268420bce9 (diff) | |
download | bionic-9d40326830c2bd407427889c554adeb915ee6b4a.zip bionic-9d40326830c2bd407427889c554adeb915ee6b4a.tar.gz bionic-9d40326830c2bd407427889c554adeb915ee6b4a.tar.bz2 |
arm: rewrite crtbegin* as C files.
Rewrite
crtbegin.S -> crtbegin.c
crtbegin_so.S -> crtbegin_so.c
This change allows us to generate PIC code without relying
on text relocations.
As a consequence of this rewrite, also rewrite
__dso_handle.S -> __dso_handle.c
__dso_handle_so.S -> __dso_handle_so.c
atexit.S -> atexit.c
In crtbegin.c _start, place the __PREINIT_ARRAY__, __INIT_ARRAY__,
__FINI_ARRAY__, and __CTOR_LIST__ variables onto the stack, instead of
passing a pointer to the text section of the binary.
This change appears sorta wonky, as I attempted to preserve,
as much as possible, the structure of the original assembly.
As a result, you have C files including other C files, and other
programming uglyness.
Result: This change reduces the number of files with text-relocations
from 315 to 19 on my Android build.
Before:
$ scanelf -aR $OUT/system | grep TEXTREL | wc -l
315
After:
$ scanelf -aR $OUT/system | grep TEXTREL | wc -l
19
Change-Id: Ib9f98107c0eeabcb606e1ddc7ed7fc4eba01c9c4
Diffstat (limited to 'libc/Android.mk')
-rw-r--r-- | libc/Android.mk | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/libc/Android.mk b/libc/Android.mk index 77da9c8..9887589 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -515,8 +515,8 @@ else libc_common_cflags += -DANDROID_SMP=0 endif -# Needed to access private/__dso_handle.S from -# crtbegin_xxx.S and crtend_xxx.S +# Needed to access private/__dso_handle.h from +# crtbegin_xxx.c and crtend_xxx.c # libc_crt_target_cflags += -I$(LOCAL_PATH)/private @@ -531,9 +531,8 @@ libc_common_c_includes := \ $(LOCAL_PATH)/string \ $(LOCAL_PATH)/stdio -# Needed to access private/__dso_handle.S from +# Needed to access private/__dso_handle.h from # crtbegin_xxx.S and crtend_xxx.S -# and machine/asm.h # libc_crt_target_cflags += -I$(LOCAL_PATH)/private -I$(LOCAL_PATH)/arch-$(TARGET_ARCH)/include @@ -555,12 +554,16 @@ ifneq ($(filter arm x86,$(TARGET_ARCH)),) # libc_crt_target_so_cflags := $(libc_crt_target_cflags) +libc_crt_target_crtstart_file := $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin.c +libc_crt_target_crtstart_so_file := $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.c ifeq ($(TARGET_ARCH),x86) # This flag must be added for x86 targets, but not for ARM libc_crt_target_so_cflags += -fPIC + libc_crt_target_crtstart_file := $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin.S + libc_crt_target_crtstart_so_file := $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.S endif GEN := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_so.o -$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.S +$(GEN): $(libc_crt_target_crtstart_so_file) @mkdir -p $(dir $@) $(TARGET_CC) $(libc_crt_target_so_cflags) -o $@ -c $< ALL_GENERATED_SOURCES += $(GEN) @@ -574,13 +577,13 @@ endif # TARGET_ARCH == x86 || TARGET_ARCH == arm GEN := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_static.o -$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin.S +$(GEN): $(libc_crt_target_crtstart_file) @mkdir -p $(dir $@) $(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $< ALL_GENERATED_SOURCES += $(GEN) GEN := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_dynamic.o -$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin.S +$(GEN): $(libc_crt_target_crtstart_file) @mkdir -p $(dir $@) $(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $< ALL_GENERATED_SOURCES += $(GEN) |