summaryrefslogtreecommitdiff
path: root/toolchain/elf2flt
diff options
context:
space:
mode:
Diffstat (limited to 'toolchain/elf2flt')
-rw-r--r--toolchain/elf2flt/elf2flt.nios2.conditional348
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 = . ;