diff options
Diffstat (limited to 'toolchain/elf2flt/elf2flt.nios2.conditional')
| -rw-r--r-- | toolchain/elf2flt/elf2flt.nios2.conditional | 335 | 
1 files changed, 335 insertions, 0 deletions
| diff --git a/toolchain/elf2flt/elf2flt.nios2.conditional b/toolchain/elf2flt/elf2flt.nios2.conditional new file mode 100644 index 000000000..42b24b8fa --- /dev/null +++ b/toolchain/elf2flt/elf2flt.nios2.conditional @@ -0,0 +1,335 @@ +--- 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  | 
