--- 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