diff options
| -rw-r--r-- | toolchain/elf2flt/elf2flt.nios2.conditional | 348 | 
1 files changed, 13 insertions, 335 deletions
| diff --git a/toolchain/elf2flt/elf2flt.nios2.conditional b/toolchain/elf2flt/elf2flt.nios2.conditional index 42b24b8fa..8442f9385 100644 --- a/toolchain/elf2flt/elf2flt.nios2.conditional +++ b/toolchain/elf2flt/elf2flt.nios2.conditional @@ -1,335 +1,13 @@ ---- elf2flt/Makefile.in -+++ elf2flt/Makefile.in -@@ -34,6 +34,12 @@ else  - SRC_LDFILE= elf2flt.ld - endif -  -+ifeq ($(strip $(CPU)),nios2) -+SRC_LDFILE= $(CPU)-elf2flt.ld -+else  -+SRC_LDFILE= elf2flt.ld -+endif -+ - target_bindir = $(prefix)/$(TARGET)/bin - target_libdir = $(prefix)/$(TARGET)/lib -  ---- elf2flt/elf2flt.c -+++ elf2flt/elf2flt.c -@@ -553,9 +553,11 @@ dump_symbols(symbols, number_of_symbols) - 	 *	Only relocate things in the data sections if we are PIC/GOT. - 	 *	otherwise do text as well - 	 */ --	if (!pic_with_got && (a->flags & SEC_CODE)) -+// wentao	if (!pic_with_got && (a->flags & SEC_CODE)) -+	if (!pic_with_got && (strcmp(".text", a->name) == 0)) - 		sectionp = text + (a->vma - text_vma); --	else if (a->flags & SEC_DATA) -+//	wentao else if (a->flags & SEC_DATA) -+	else if (strcmp(".data", a->name) == 0) - 		sectionp = data + (a->vma - data_vma); - 	else - 		continue; -@@ -926,8 +928,7 @@ dump_symbols(symbols, number_of_symbols) - 						bad_relocs++; - 						continue; - 					} --					/* Absolute symbol done not relocation */ --					relocation_needed = !bfd_is_abs_section(sym_section); -+					relocation_needed = 1; - 					sym_addr = (*(q->sym_ptr_ptr))->value; - 					sym_vma = bfd_section_vma(abs_bfd, sym_section); - 					sym_addr += sym_vma + q->addend; -@@ -1013,19 +1014,10 @@ dump_symbols(symbols, number_of_symbols) -  - 					/* grab any offset from the text */ - 					offset = (p[0]<<24) + (p[1] << 16) + (p[2] << 8) + (p[3]); -+					//sym_addr = (*(q->sym_ptr_ptr))->value; - 					sym_vma = bfd_section_vma(abs_bfd, sym_section); --					/* This is a horrible kludge.  For some --					   reason, *sometimes* the offset is in --					   both addend and the code.  Detect --					   it, and cancel the effect.  Otherwise --					   the offset gets added twice - ouch. --					   There should be a better test --					   for this condition, based on the --					   BFD data structures */ --					if(offset==q->addend) --						offset=0; -- - 					sym_addr += offset + sym_vma + q->addend; -+ - 					relocation_needed = 1; - 					break; - 				} -@@ -1848,32 +1840,27 @@ int main(int argc, char *argv[]) -   /* Group output sections into text, data, and bss, and calc their sizes.  */ -   for (s = abs_bfd->sections; s != NULL; s = s->next) { -     unsigned long *vma, *len; --    bfd_size_type sec_size; --    bfd_vma sec_vma; -  --    if (s->flags & SEC_CODE) { -+	if (strcmp(s->name, ".text") == 0) /*wentao    if (s->flags & SEC_CODE)*/ { -       vma = &text_vma; -       len = &text_len; --    } else if (s->flags & SEC_DATA) { -+    } else if (strcmp(s->name, ".data") == 0) /* wentao (s->flags & SEC_DATA)*/ { -       vma = &data_vma; -       len = &data_len; --    } else if (s->flags & SEC_ALLOC) { -+    } else if (strcmp(s->name, ".bss") == 0) /*(s->flags & SEC_ALLOC)*/ { -       vma = &bss_vma; -       len = &bss_len; -     } else -       continue; -  --    sec_size = bfd_section_size(abs_bfd, s); --    sec_vma  = bfd_section_vma(abs_bfd, s); -- --    if (sec_vma < *vma) { -+    if (s->vma < *vma) { -       if (*len > 0) --	*len += sec_vma - *vma; -+	*len += s->vma - *vma; -       else --	*len = sec_size; --      *vma = sec_vma; --    } else if (sec_vma + sec_size > *vma + *len) --      *len = sec_vma + sec_size - *vma; -+	*len = s->_raw_size; -+      *vma = s->vma; -+    } else if (s->vma + s->_raw_size > *vma + *len) -+      *len = s->vma + s->_raw_size - *vma; -   } -  -   if (text_len == 0) { -@@ -1888,10 +1875,10 @@ int main(int argc, char *argv[]) -  -   /* Read in all text sections.  */ -   for (s = abs_bfd->sections; s != NULL; s = s->next) --    if (s->flags & SEC_CODE)  -+    if (strcmp(s->name, ".text") == 0) /* wentao (s->flags & SEC_CODE) */ -       if (!bfd_get_section_contents(abs_bfd, s, - 				   text + (s->vma - text_vma), 0, --				   bfd_section_size(abs_bfd, s))) -+				   s->_raw_size)) -       { - 	fprintf(stderr, "read error section %s\n", s->name); - 	exit(2); -@@ -1919,10 +1906,10 @@ int main(int argc, char *argv[]) -  -   /* Read in all data sections.  */ -   for (s = abs_bfd->sections; s != NULL; s = s->next) --    if (s->flags & SEC_DATA)  -+    if (strcmp(s->name, ".data") == 0) /* wentao (s->flags & SEC_DATA)*/  -       if (!bfd_get_section_contents(abs_bfd, s, - 				   data + (s->vma - data_vma), 0, --				   bfd_section_size(abs_bfd, s))) -+				   s->_raw_size)) -       { - 	fprintf(stderr, "read error section %s\n", s->name); - 	exit(2); ---- elf2flt/nios2-elf2flt.ld -+++ elf2flt/nios2-elf2flt.ld -@@ -0,0 +1,126 @@ -+ENTRY (_start) -+ -+MEMORY { -+        flatmem : ORIGIN = 0x0, LENGTH = 0xfffffff -+} -+ -+SECTIONS { -+        .text 0 : { -+		/* Avoid address 0; binfmt_flat treats it specially.  */ -+		. = . + 4 ; -+ -+                . = ALIGN(0x4) ; -+                _stext = . ; -+ -+                *(.text) -+                *(.text.*) -+                *(.gnu.warning) -+                *(.stub) -+                *(.gnu.linkonce.t*) -+				*(.jcr) -+                *(.init) -+                *(.fini) -+ -+		/* This is special code area at the end of the normal -+		   text section.  It contains a small lookup table at -+		   the start followed by the code pointed to by entries -+		   in the lookup table.  */ -+		. = ALIGN (4) ; -+		PROVIDE(__ctbp = .); -+		*(.call_table_data) -+		*(.call_table_text) -+ -+		. = ALIGN(0x10) ; -+		_etext = . ; -+        } > flatmem -+        .data : { -+                . = ALIGN(0x4) ; -+                _sdata = . ; -+				__data_start = . ; -+				data_start = . ; -+				*(.rela.got) -+				*(.rel.got) -+				*(.got.plt) -+				*(.got) -+				LONG(-1) -+                *(.rodata) -+                *(.rodata1) -+                *(.rodata.*) -+                *(.gnu.linkonce.r*) -+                *(.data) -+                *(.data.*) -+                *(.gnu.linkonce.d*) -+                *(.data1) -+                *(.eh_frame) -+                *(.gcc_except_table) -+				. = ALIGN(4) ; -+				*(.ctors.*) -+				*(.ctors) -+				LONG(0) -+				*(.dtors.*) -+				*(.dtors) -+				LONG(0) -+                . = ALIGN(0x10) ; -+ -+				_gp = ABSOLUTE(ALIGN(16) + 0x7ff0); -+		  		PROVIDE(gp = _gp); -+                *(.sdata)  -+                *(.sdata.*) -+                *(.sbss) -+                *(.gnu.linkonce.s.*) -+                _edata = . ; -+        } > flatmem -+        .bss : { -+                . = ALIGN(0x4) ; -+                _sbss = ALIGN(0x4) ; -+				__bss_start = . ; -+                *(.dynsbss) -+                *(.sbss) -+                *(.sbss.*) -+                *(.scommon) -+                *(.dynbss) -+                *(.bss) -+                *(.bss.*) -+                *(COMMON) -+                . = ALIGN(0x4) ; -+                _ebss = . ; -+				_end = . ; -+				end = . ; -+        } > flatmem -+         -+  .junk 0 : { *(.rel*) *(.rela*) } -+  /* Stabs debugging sections.  */ -+  .stab 0 : { *(.stab) } -+  .stabstr 0 : { *(.stabstr) } -+  .stab.excl 0 : { *(.stab.excl) } -+  .stab.exclstr 0 : { *(.stab.exclstr) } -+  .stab.index 0 : { *(.stab.index) } -+  .stab.indexstr 0 : { *(.stab.indexstr) } -+  .comment 0 : { *(.comment) } -+  /* DWARF debug sections. -+     Symbols in the DWARF debugging sections are relative to the beginning -+     of the section so we begin them at 0.  */ -+  /* DWARF 1 */ -+  .debug          0 : { *(.debug) } -+  .line           0 : { *(.line) } -+  /* GNU DWARF 1 extensions */ -+  .debug_srcinfo  0 : { *(.debug_srcinfo) } -+  .debug_sfnames  0 : { *(.debug_sfnames) } -+  /* DWARF 1.1 and DWARF 2 */ -+  .debug_aranges  0 : { *(.debug_aranges) } -+  .debug_pubnames 0 : { *(.debug_pubnames) } -+  /* DWARF 2 */ -+  .debug_info     0 : { *(.debug_info) } -+  .debug_abbrev   0 : { *(.debug_abbrev) } -+  .debug_line     0 : { *(.debug_line) } -+  .debug_frame    0 : { *(.debug_frame) } -+  .debug_str      0 : { *(.debug_str) } -+  .debug_loc      0 : { *(.debug_loc) } -+  .debug_macinfo  0 : { *(.debug_macinfo) } -+  /* SGI/MIPS DWARF 2 extensions */ -+  .debug_weaknames 0 : { *(.debug_weaknames) } -+  .debug_funcnames 0 : { *(.debug_funcnames) } -+  .debug_typenames 0 : { *(.debug_typenames) } -+  .debug_varnames  0 : { *(.debug_varnames) } -+  /* These must appear regardless of  .  */         -+} ---- elf2flt/ld-elf2flt.in -+++ elf2flt/ld-elf2flt.in -@@ -15,13 +15,9 @@ - LINKER="$0.real"            # the original renamed-linker - ELF2FLT="`expr $0 : '\(.*\)ld'`elf2flt" - TOOLDIR="`dirname $0`"      # let gcc find the tools for us --LDSCRIPTPATH="${TOOLDIR}/../@target_alias@/lib"		# and the scripts - SHARED_ID="" - NEWLDSCRIPT="" -  --# check TOOLDIR from prefix/bin/ or prefix/target-alias/bin/ --[ -d "${TOOLDIR}/../@target_alias@/lib" ] || LDSCRIPTPATH="${TOOLDIR}/../lib" -- - # - # if we have the elf2flt options, run it - # -@@ -77,9 +73,6 @@ then - 				  VERBOSE="y" - 				  ;; -  --		-m)       shift; EMUL="-m $1";;        # ld emulations for h8300 --		-m*)      EMUL=$1;; --  - 		*)        ARG1="$ARG1 $1" - 				  ;; - 		esac -@@ -120,37 +113,33 @@ then - 			fi -  - 			# Provide the magic parameter that defines the library data segment pointer offset --			case "@target_cpu@" in --			    h8300) GOT_OFFSET="__current_shared_library_er5_offset_";; --			    *)     GOT_OFFSET="_current_shared_library_a5_offset_";; --			esac --			ARG1="$ARG1 -defsym $GOT_OFFSET=`expr ${SHARED_ID} '*' -4 - 4`" -+			ARG1="$ARG1 -defsym _current_shared_library_a5_offset_=`expr ${SHARED_ID} '*' -4 - 4`" - 		fi - 		 - 		# provide a default linker script, we usually need one --		[ -z "$LDSCRIPT" ] && LDSCRIPT="${LDSCRIPTPATH}/elf2flt.ld" -+		[ -z "$LDSCRIPT" ] && LDSCRIPT="@prefix@/@target_alias@/lib/elf2flt.ld" -  - 		# if we can find the linker script we preprocess it,  otherwise - 		# we assume the user knows what they are doing - 		if [ -f "$LDSCRIPT" ]; then - 			sed $SEDOP < "$LDSCRIPT" > "$NEWLDSCRIPT" - 			LDSCRIPT="$NEWLDSCRIPT" --		elif [ -f "${LDSCRIPTPATH}/$LDSCRIPT" ]; then --			sed $SEDOP < "${LDSCRIPTPATH}/$LDSCRIPT" > "$NEWLDSCRIPT" -+		elif [ -f "@prefix@/@target_alias@/lib/$LDSCRIPT" ]; then -+			sed $SEDOP < "@prefix@/@target_alias@/lib/$LDSCRIPT" > "$NEWLDSCRIPT" - 			LDSCRIPT="$NEWLDSCRIPT" --		elif [ -f "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" ]; then --			sed $SEDOP < "${LDSCRIPTPATH}/ldscripts/$LDSCRIPT" > "$NEWLDSCRIPT" -+		elif [ -f "@prefix@/@target_alias@/lib/ldscripts/$LDSCRIPT" ]; then -+			sed $SEDOP < "@prefix@/@target_alias@/lib/ldscripts/$LDSCRIPT" > "$NEWLDSCRIPT" - 			LDSCRIPT="$NEWLDSCRIPT" - 		fi -  - 		if [ "@got_check@" = "no" ] - 		then --		 $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -d -o "$OFILE.elf" $ARG1         ||exit $? --		 $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" $ARG1                ||exit $? -+		 $LINKER $SDIRS -T $LDSCRIPT -Ur -d -o "$OFILE.elf" $ARG1         ||exit $? -+		 $LINKER $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" $ARG1                ||exit $? - 		else --		 $LINKER $EMUL -r -d -o "$OFILE.elf2flt" $ARG1                          ||exit $? --		 $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -o "$OFILE.elf" "$OFILE.elf2flt" ||exit $? --		 $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" "$OFILE.elf2flt"     ||exit $? -+		 $LINKER -r -d -o "$OFILE.elf2flt" $ARG1                          ||exit $? -+		 $LINKER $SDIRS -T $LDSCRIPT -Ur -o "$OFILE.elf" "$OFILE.elf2flt" ||exit $? -+		 $LINKER $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" "$OFILE.elf2flt"     ||exit $? - 		 rm -f "$OFILE.elf2flt" - 		fi - 		if grep _GLOBAL_OFFSET_TABLE_ "$OFILE.gdb" > /dev/null  +--- elf2flt/elf2flt.ld +++ elf2flt/elf2flt.ld +@@ -62,6 +62,10 @@ + 		*(.eh_frame) + 		*(.gcc_except_table) +  ++		/* nios2 need gp */ ++		_gp = ABSOLUTE(ALIGN(16) + 0x7ff0); ++		PROVIDE(gp = _gp); ++ + 		/* Microblaze has .sdata and .sbss (small bss).  They must + 		   be contiguous, so please don't move any of this. JW */ + 		_ssrw = . ;			 | 
