1From 674fa6037621df8bc2d900406ec151d6a437c071 Mon Sep 17 00:00:00 2001 2From: Chao-ying Fu <fu@mips.com> 3Date: Mon, 11 Jun 2012 11:14:39 -0700 4Subject: [PATCH] Modify linker script generation for MIPS Android. 5 6--- 7 binutils-2.21/ld/emulparams/elf32bmip.sh | 8 +---- 8 binutils-2.21/ld/emulparams/elf32ltsmip.sh | 1 + 9 binutils-2.21/ld/genscripts.sh | 5 ++- 10 binutils-2.21/ld/scripttempl/elf.sc | 54 +++++++++++++++++----------- 11 4 files changed, 39 insertions(+), 29 deletions(-) 12 13diff --git a/binutils-2.21/ld/emulparams/elf32bmip.sh b/binutils-2.21/ld/emulparams/elf32bmip.sh 14index 44a0b8a..8dae1bb 100644 15--- a/binutils-2.21/ld/emulparams/elf32bmip.sh 16+++ b/binutils-2.21/ld/emulparams/elf32bmip.sh 17@@ -6,7 +6,7 @@ SCRIPT_NAME=elf 18 OUTPUT_FORMAT="elf32-bigmips" 19 BIG_OUTPUT_FORMAT="elf32-bigmips" 20 LITTLE_OUTPUT_FORMAT="elf32-littlemips" 21-TEXT_START_ADDR=0x0400000 22+TEXT_START_ADDR=0x80000 23 test -n "${EMBEDDED}" || DATA_ADDR=0x10000000 24 MAXPAGESIZE="CONSTANT (MAXPAGESIZE)" 25 COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)" 26@@ -64,12 +64,6 @@ OTHER_BSS_SYMBOLS='_fbss = .;' 27 OTHER_SECTIONS=' 28 .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } 29 .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } 30- .mdebug.abi32 : { KEEP(*(.mdebug.abi32)) } 31- .mdebug.abiN32 : { KEEP(*(.mdebug.abiN32)) } 32- .mdebug.abi64 : { KEEP(*(.mdebug.abi64)) } 33- .mdebug.abiO64 : { KEEP(*(.mdebug.abiO64)) } 34- .mdebug.eabi32 : { KEEP(*(.mdebug.eabi32)) } 35- .mdebug.eabi64 : { KEEP(*(.mdebug.eabi64)) } 36 .gcc_compiled_long32 : { KEEP(*(.gcc_compiled_long32)) } 37 .gcc_compiled_long64 : { KEEP(*(.gcc_compiled_long64)) } 38 ' 39diff --git a/binutils-2.21/ld/emulparams/elf32ltsmip.sh b/binutils-2.21/ld/emulparams/elf32ltsmip.sh 40index 4a660f0..edf73df 100644 41--- a/binutils-2.21/ld/emulparams/elf32ltsmip.sh 42+++ b/binutils-2.21/ld/emulparams/elf32ltsmip.sh 43@@ -1,2 +1,3 @@ 44 . ${srcdir}/emulparams/elf32btsmip.sh 45 OUTPUT_FORMAT="elf32-tradlittlemips" 46+unset TEXT_DYNAMIC 47diff --git a/binutils-2.21/ld/genscripts.sh b/binutils-2.21/ld/genscripts.sh 48index c86631b..d54d85d 100755 49--- a/binutils-2.21/ld/genscripts.sh 50+++ b/binutils-2.21/ld/genscripts.sh 51@@ -239,7 +239,8 @@ if [ "x${use_sysroot}" != "xyes" ] ; then 52 fi 53 fi 54 55-LIB_SEARCH_DIRS=`echo ${LIB_PATH} | sed -e 's/:/ /g' -e 's/\([^ ][^ ]*\)/SEARCH_DIR(\\"\1\\");/g'` 56+# For Android, comment out LIB_SEARCH_DIRS. 57+#LIB_SEARCH_DIRS=`echo ${LIB_PATH} | sed -e 's/:/ /g' -e 's/\([^ ][^ ]*\)/SEARCH_DIR(\\"\1\\");/g'` 58 59 # We need it for testsuite. 60 set $EMULATION_LIBPATH 61@@ -305,6 +306,7 @@ LD_FLAG= 62 DATA_ALIGNMENT=${DATA_ALIGNMENT_} 63 RELOCATING=" " 64 ( echo "/* Default linker script, for normal executables */" 65+ echo "/* Modified for Android. */" 66 . ${CUSTOMIZER_SCRIPT} 67 . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 68 ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.x 69@@ -358,6 +360,7 @@ if test -n "$GENERATE_SHLIB_SCRIPT"; then 70 DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}} 71 COMBRELOC=ldscripts/${EMULATION_NAME}.xsc.tmp 72 ( echo "/* Script for --shared -z combreloc: shared library, combine & sort relocs */" 73+ echo "/* Modified for Android. */" 74 . ${CUSTOMIZER_SCRIPT} 75 . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 76 ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsc 77diff --git a/binutils-2.21/ld/scripttempl/elf.sc b/binutils-2.21/ld/scripttempl/elf.sc 78index f020a66..0fcc22d 100644 79--- a/binutils-2.21/ld/scripttempl/elf.sc 80+++ b/binutils-2.21/ld/scripttempl/elf.sc 81@@ -111,7 +111,9 @@ DATA_SEGMENT_ALIGN="ALIGN(${SEGMENT_SIZE}) + (. & (${MAXPAGESIZE} - 1))" 82 DATA_SEGMENT_RELRO_END="" 83 DATA_SEGMENT_END="" 84 if test -n "${COMMONPAGESIZE}"; then 85- DATA_SEGMENT_ALIGN="ALIGN (${SEGMENT_SIZE}) - ((${MAXPAGESIZE} - .) & (${MAXPAGESIZE} - 1)); . = DATA_SEGMENT_ALIGN (${MAXPAGESIZE}, ${COMMONPAGESIZE})" 86+ #DATA_SEGMENT_ALIGN="ALIGN (${SEGMENT_SIZE}) - ((${MAXPAGESIZE} - .) & (${MAXPAGESIZE} - 1)); . = DATA_SEGMENT_ALIGN (${MAXPAGESIZE}, ${COMMONPAGESIZE})" 87+ # For Android, we align at exactly a page boundary. 88+ DATA_SEGMENT_ALIGN="ALIGN (${SEGMENT_SIZE}); . = DATA_SEGMENT_ALIGN (${MAXPAGESIZE}, ${COMMONPAGESIZE})" 89 DATA_SEGMENT_END=". = DATA_SEGMENT_END (.);" 90 DATA_SEGMENT_RELRO_END=". = DATA_SEGMENT_RELRO_END (${SEPARATE_GOTPLT-0}, .);" 91 fi 92@@ -149,7 +151,7 @@ RELA_IPLT=".rela.iplt ${RELOCATING-0} : 93 DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" 94 RODATA=".${RODATA_NAME} ${RELOCATING-0} : { *(.${RODATA_NAME}${RELOCATING+ .${RODATA_NAME}.* .gnu.linkonce.r.*}) }" 95 DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }" 96-DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }" 97+DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.mdebug.*) }" 98 if test -z "${NO_SMALL_DATA}"; then 99 SBSS=".${SBSS_NAME} ${RELOCATING-0} : 100 { 101@@ -224,17 +226,15 @@ test "${LARGE_SECTIONS}" = "yes" && LARGE_SECTIONS=" 102 }" 103 INIT_ARRAY=".init_array ${RELOCATING-0} : 104 { 105- ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_start = .);}} 106+ KEEP (*crtbegin*.o(.init_array)) 107 KEEP (*(SORT(.init_array.*))) 108 KEEP (*(.init_array)) 109- ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_end = .);}} 110 }" 111 FINI_ARRAY=".fini_array ${RELOCATING-0} : 112 { 113- ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_start = .);}} 114+ KEEP (*crtbegin*.o(.fini_array)) 115 KEEP (*(SORT(.fini_array.*))) 116 KEEP (*(.fini_array)) 117- ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_end = .);}} 118 }" 119 CTOR=".ctors ${CONSTRUCTING-0} : 120 { 121@@ -250,14 +250,14 @@ CTOR=".ctors ${CONSTRUCTING-0} : 122 is in. */ 123 124 KEEP (*crtbegin.o(.ctors)) 125- KEEP (*crtbegin?.o(.ctors)) 126+ KEEP (*crtbegin*.o(.ctors)) 127 128 /* We don't want to include the .ctor section from 129 the crtend.o file until after the sorted ctors. 130 The .ctor section from the crtend file contains the 131 end of ctors marker and it must be last */ 132 133- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors)) 134+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend*.o $OTHER_EXCLUDE_FILES) .ctors)) 135 KEEP (*(SORT(.ctors.*))) 136 KEEP (*(.ctors)) 137 ${CONSTRUCTING+${CTOR_END}} 138@@ -266,8 +266,8 @@ DTOR=".dtors ${CONSTRUCTING-0} : 139 { 140 ${CONSTRUCTING+${DTOR_START}} 141 KEEP (*crtbegin.o(.dtors)) 142- KEEP (*crtbegin?.o(.dtors)) 143- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors)) 144+ KEEP (*crtbegin*.o(.dtors)) 145+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend*.o $OTHER_EXCLUDE_FILES) .dtors)) 146 KEEP (*(SORT(.dtors.*))) 147 KEEP (*(.dtors)) 148 ${CONSTRUCTING+${DTOR_END}} 149@@ -278,8 +278,11 @@ STACK=" .stack ${RELOCATING-0}${RELOCATING+${STACK_ADDR}} : 150 *(.stack) 151 }" 152 153-TEXT_START_ADDR="SEGMENT_START(\"text-segment\", ${TEXT_START_ADDR})" 154-SHLIB_TEXT_START_ADDR="SEGMENT_START(\"text-segment\", ${SHLIB_TEXT_START_ADDR:-0})" 155+# For Android, remove SEGMENT_START. 156+#TEXT_START_ADDR="SEGMENT_START(\"text-segment\", ${TEXT_START_ADDR})" 157+#SHLIB_TEXT_START_ADDR="SEGMENT_START(\"text-segment\", ${SHLIB_TEXT_START_ADDR:-0})" 158+TEXT_START_ADDR="${TEXT_START_ADDR}" 159+SHLIB_TEXT_START_ADDR="0" 160 161 # if this is for an embedded system, don't add SIZEOF_HEADERS. 162 if [ -z "$EMBEDDED" ]; then 163@@ -459,8 +462,8 @@ cat <<EOF 164 .eh_frame ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) } 165 .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } 166 167- /* Adjust the address for the data segment. We want to adjust up to 168- the same address within the page on the next page up. */ 169+ /* Adjust the address for the data segment. We want to align at exactly 170+ a page boundary to make life easier for apriori. */ 171 ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}} 172 ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}} 173 ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}} 174@@ -473,14 +476,23 @@ cat <<EOF 175 .tdata ${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) } 176 .tbss ${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} } 177 178+ /* Ensure the __preinit_array_start label is properly aligned. We 179+ could instead move the label definition inside the section, but 180+ the linker would then create the section even if it turns out to 181+ be empty, which isn't pretty. */ 182+ . = ALIGN(32 / 8); 183+ ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__preinit_array_start = .);}} 184 .preinit_array ${RELOCATING-0} : 185 { 186- ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__preinit_array_start = .);}} 187 KEEP (*(.preinit_array)) 188- ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__preinit_array_end = .);}} 189 } 190+ ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__preinit_array_end = .);}} 191+ ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_start = .);}} 192 ${RELOCATING+${INIT_ARRAY}} 193+ ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_end = .);}} 194+ ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_start = .);}} 195 ${RELOCATING+${FINI_ARRAY}} 196+ ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_end = .);}} 197 ${SMALL_DATA_CTOR-${RELOCATING+${CTOR}}} 198 ${SMALL_DATA_DTOR-${RELOCATING+${DTOR}}} 199 .jcr ${RELOCATING-0} : { KEEP (*(.jcr)) } 200@@ -526,10 +538,8 @@ cat <<EOF 201 *(COMMON) 202 /* Align here to ensure that the .bss section occupies space up to 203 _end. Align after .bss to ensure correct alignment even if the 204- .bss section disappears because there are no input sections. 205- FIXME: Why do we need it? When there is no .bss section, we don't 206- pad the .data section. */ 207- ${RELOCATING+. = ALIGN(. != 0 ? ${ALIGNMENT} : 1);} 208+ .bss section disappears because there are no input sections. */ 209+ ${RELOCATING+. = ALIGN(${ALIGNMENT});} 210 } 211 ${OTHER_BSS_SECTIONS} 212 ${RELOCATING+${OTHER_BSS_END_SYMBOLS}} 213@@ -537,7 +547,9 @@ cat <<EOF 214 ${LARGE_SECTIONS} 215 ${RELOCATING+. = ALIGN(${ALIGNMENT});} 216 ${RELOCATING+${OTHER_END_SYMBOLS}} 217- ${RELOCATING+${END_SYMBOLS-${USER_LABEL_PREFIX}_end = .; PROVIDE (${USER_LABEL_PREFIX}end = .);}} 218+ ${RELOCATING+${END_SYMBOLS-${USER_LABEL_PREFIX}_end = .; 219+ _bss_end__ = . ; __bss_end__ = . ; __end__ = . ; 220+ PROVIDE (${USER_LABEL_PREFIX}end = .);}} 221 ${RELOCATING+${DATA_SEGMENT_END}} 222 EOF 223 224-- 2251.7.7.3 226 227