summaryrefslogtreecommitdiff
path: root/toolchain/elf2flt/elf2flt.nios2.conditional
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2006-01-10 05:56:59 +0000
committerMike Frysinger <vapier@gentoo.org>2006-01-10 05:56:59 +0000
commit04735b266d84c5637dd382fd49b6bf561d30c4c1 (patch)
treef68b5d21e4ba43b70cac89d01735e54347b545aa /toolchain/elf2flt/elf2flt.nios2.conditional
parent5ebb4e6ba553bfc7ca66349a45d6ad187280dcbd (diff)
initial attempt at adding elf2flt support based upon marcs work in Bug 273
Diffstat (limited to 'toolchain/elf2flt/elf2flt.nios2.conditional')
-rw-r--r--toolchain/elf2flt/elf2flt.nios2.conditional335
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