mirror of
https://github.com/motioneye-project/motioneyeos.git
synced 2025-08-01 15:37:44 +00:00
pull from uClinux CVS
This commit is contained in:
parent
ee9c02846c
commit
e0b4700acf
@ -5,13 +5,13 @@
|
|||||||
/flat.h/1.6/Tue Jan 10 04:34:08 2006/-ko/
|
/flat.h/1.6/Tue Jan 10 04:34:08 2006/-ko/
|
||||||
/install-sh/1.1.1.1/Tue Jan 10 04:34:08 2006/-ko/
|
/install-sh/1.1.1.1/Tue Jan 10 04:34:08 2006/-ko/
|
||||||
/stubs.c/1.1/Tue Jan 10 04:34:08 2006//
|
/stubs.c/1.1/Tue Jan 10 04:34:08 2006//
|
||||||
/flthdr.c/1.8/Tue Jan 10 05:11:20 2006/-ko/
|
|
||||||
/elf2flt.ld/1.12/Tue Jan 10 05:12:32 2006/-ko/
|
|
||||||
/config.sub/1.8/Wed Jan 11 13:36:39 2006/-ko/
|
/config.sub/1.8/Wed Jan 11 13:36:39 2006/-ko/
|
||||||
/cygwin-elf.h/1.4/Wed Jan 11 13:36:39 2006//
|
/cygwin-elf.h/1.4/Wed Jan 11 13:36:39 2006//
|
||||||
/elf2flt.c/1.38/Fri Jan 13 08:02:22 2006/-ko/
|
/Makefile.in/1.17/Result of merge/-ko/
|
||||||
/Makefile.in/1.15/Result of merge/-ko/
|
/configure/1.12/Sun Jan 28 05:27:28 2007/-ko/
|
||||||
/configure.in/1.8/Mon Feb 6 05:04:36 2006/-ko/
|
/configure.in/1.10/Sun Jan 28 05:27:28 2007/-ko/
|
||||||
/ld-elf2flt.in/1.11/Mon Feb 6 05:04:36 2006//
|
/elf2flt.c/1.46/Result of merge/-ko/
|
||||||
/configure/1.9/Mon Feb 6 05:05:05 2006/-ko/
|
/elf2flt.ld/1.15/Sun Jan 28 05:27:28 2007/-ko/
|
||||||
|
/flthdr.c/1.10/Sun Jan 28 05:27:28 2007/-ko/
|
||||||
|
/ld-elf2flt.in/1.15/Sun Jan 28 05:27:28 2007//
|
||||||
D
|
D
|
||||||
|
@ -66,10 +66,10 @@ install:
|
|||||||
$(INSTALL) -d $(bindir)
|
$(INSTALL) -d $(bindir)
|
||||||
$(INSTALL) -d $(target_bindir)
|
$(INSTALL) -d $(target_bindir)
|
||||||
$(INSTALL) -d $(target_libdir)
|
$(INSTALL) -d $(target_libdir)
|
||||||
$(INSTALL) -s -m 755 $(PROG_FLTHDR) $(bindir)/$(TARGET)-$(PROG_FLTHDR)
|
$(INSTALL) -m 755 $(PROG_FLTHDR) $(bindir)/$(TARGET)-$(PROG_FLTHDR)
|
||||||
$(INSTALL) -s -m 755 $(PROG_FLTHDR) $(target_bindir)/$(PROG_FLTHDR)
|
$(INSTALL) -m 755 $(PROG_FLTHDR) $(target_bindir)/$(PROG_FLTHDR)
|
||||||
$(INSTALL) -s -m 755 $(PROG_ELF2FLT) $(bindir)/$(TARGET)-$(PROG_ELF2FLT)
|
$(INSTALL) -m 755 $(PROG_ELF2FLT) $(bindir)/$(TARGET)-$(PROG_ELF2FLT)
|
||||||
$(INSTALL) -s -m 755 $(PROG_ELF2FLT) $(target_bindir)/$(PROG_ELF2FLT)
|
$(INSTALL) -m 755 $(PROG_ELF2FLT) $(target_bindir)/$(PROG_ELF2FLT)
|
||||||
[ -f $(bindir)/$(TARGET)-ld.real$(EXEEXT) ] || \
|
[ -f $(bindir)/$(TARGET)-ld.real$(EXEEXT) ] || \
|
||||||
mv $(bindir)/$(TARGET)-ld$(EXEEXT) $(bindir)/$(TARGET)-ld.real$(EXEEXT)
|
mv $(bindir)/$(TARGET)-ld$(EXEEXT) $(bindir)/$(TARGET)-ld.real$(EXEEXT)
|
||||||
[ -f $(target_bindir)/ld.real$(EXEEXT) ] || \
|
[ -f $(target_bindir)/ld.real$(EXEEXT) ] || \
|
||||||
|
792
toolchain/elf2flt/elf2flt/configure
vendored
792
toolchain/elf2flt/elf2flt/configure
vendored
File diff suppressed because it is too large
Load Diff
@ -37,6 +37,12 @@ AC_ARG_ENABLE(got-check,
|
|||||||
[ got_check=yes ]
|
[ got_check=yes ]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(emit_relocs,
|
||||||
|
[ --disable-emit-relocs - don't use the --emit-relocs (-q) linker option ],
|
||||||
|
[ emit_relocs=$enableval ],
|
||||||
|
[ emit_relocs=yes ]
|
||||||
|
)
|
||||||
|
|
||||||
AC_CANONICAL_HOST
|
AC_CANONICAL_HOST
|
||||||
AC_CANONICAL_TARGET
|
AC_CANONICAL_TARGET
|
||||||
|
|
||||||
@ -75,29 +81,29 @@ fi
|
|||||||
binutils_ldscript_dir="$ac_binutils_ldscript_dir"
|
binutils_ldscript_dir="$ac_binutils_ldscript_dir"
|
||||||
|
|
||||||
if test "$ac_libbfd" = "NONE" -o "$ac_libiberty" = "NONE" ; then
|
if test "$ac_libbfd" = "NONE" -o "$ac_libiberty" = "NONE" ; then
|
||||||
echo
|
AC_MSG_ERROR([
|
||||||
echo "You need to specify the location of the libfd.a and libiberty.a"
|
|
||||||
echo "host libraries from the binutils package."
|
You need to specify the location of the libfd.a and libiberty.a
|
||||||
echo
|
host libraries from the binutils package.
|
||||||
echo "Run configure again specifying these options:"
|
|
||||||
echo
|
Run configure again specifying these options:
|
||||||
echo " ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>"
|
|
||||||
echo
|
./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>
|
||||||
exit 1
|
])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$ac_bfd_include_dir" = "NONE" ; then
|
if test "$ac_bfd_include_dir" = "NONE" ; then
|
||||||
echo
|
AC_MSG_ERROR([
|
||||||
echo "You need to specify the location of the bfd.h header from a"
|
|
||||||
echo "configured/compiled version of the binutils package for your target."
|
You need to specify the location of the bfd.h header from a
|
||||||
echo "Without this your elf2flt may crash as it will try to use the"
|
configured/compiled version of the binutils package for your target.
|
||||||
echo "systems bfd.h which may be from a different binutils package."
|
Without this your elf2flt may crash as it will try to use the
|
||||||
echo
|
systems bfd.h which may be from a different binutils package.
|
||||||
echo "Run configure again specifying these options:"
|
|
||||||
echo
|
Run configure again specifying these options:
|
||||||
echo " ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>"
|
|
||||||
echo
|
./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>
|
||||||
exit 1
|
])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl Checks for header files.
|
dnl Checks for header files.
|
||||||
@ -122,6 +128,7 @@ AC_SUBST(bfd_include_dir)
|
|||||||
AC_SUBST(binutils_include_dir)
|
AC_SUBST(binutils_include_dir)
|
||||||
AC_SUBST(binutils_ldscript_dir)
|
AC_SUBST(binutils_ldscript_dir)
|
||||||
AC_SUBST(got_check)
|
AC_SUBST(got_check)
|
||||||
|
AC_SUBST(emit_relocs)
|
||||||
|
|
||||||
AC_OUTPUT(Makefile ld-elf2flt)
|
AC_OUTPUT(Makefile ld-elf2flt)
|
||||||
|
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
* ELF format file handling. Extended relocation support for all of
|
* ELF format file handling. Extended relocation support for all of
|
||||||
* text and data.
|
* text and data.
|
||||||
*
|
*
|
||||||
|
* (c) 2006 Support the -a (use_resolved) option for TARGET_arm.
|
||||||
|
* Shaun Jackman <sjackman@gmail.com>
|
||||||
* (c) 2004, Nios II support, Wentao Xu <wentao@microtronix.com>
|
* (c) 2004, Nios II support, Wentao Xu <wentao@microtronix.com>
|
||||||
* (c) 2003, H8 support, ktrace <davidm@snapgear.com>
|
* (c) 2003, H8 support, ktrace <davidm@snapgear.com>
|
||||||
* (c) 2003-2004, MicroBlaze support, John Williams <jwilliams@itee.uq.edu.au>
|
* (c) 2003-2004, MicroBlaze support, John Williams <jwilliams@itee.uq.edu.au>
|
||||||
@ -44,8 +46,10 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
#include <netinet/in.h> /* Consts and structs defined by the internet system */
|
#include <netinet/in.h> /* Consts and structs defined by the internet system */
|
||||||
|
#define BINARY_FILE_OPTS
|
||||||
#else
|
#else
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
|
#define BINARY_FILE_OPTS "b"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* from $(INSTALLDIR)/include */
|
/* from $(INSTALLDIR)/include */
|
||||||
@ -306,119 +310,6 @@ add_com_to_bss(asymbol **symbol_table, long number_of_symbols, long bss_len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TARGET_bfin
|
#ifdef TARGET_bfin
|
||||||
/* stack to handle "arithmetic" relocations */
|
|
||||||
#define RELOC_STACK_SIZE 100
|
|
||||||
static bfd_vma reloc_stack[RELOC_STACK_SIZE];
|
|
||||||
static unsigned int reloc_stack_tos = 0;
|
|
||||||
static char sym_section_name[80];
|
|
||||||
static asection *stack_sym_section = 0;
|
|
||||||
|
|
||||||
static void
|
|
||||||
reloc_stack_set_section(asection *section, const char *sym_section_name_in)
|
|
||||||
{
|
|
||||||
/* TODO : we can add checks to make sure we do not
|
|
||||||
add different section names to the same arithmetic
|
|
||||||
expression. */
|
|
||||||
strcpy(sym_section_name, sym_section_name_in);
|
|
||||||
stack_sym_section = section;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *
|
|
||||||
reloc_stack_get_section_name()
|
|
||||||
{
|
|
||||||
return sym_section_name;
|
|
||||||
}
|
|
||||||
static asection *reloc_stack_get_section()
|
|
||||||
{
|
|
||||||
return stack_sym_section;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define is_reloc_stack_empty() ((reloc_stack_tos > 0)?0:1)
|
|
||||||
|
|
||||||
static void
|
|
||||||
reloc_stack_push(bfd_vma value)
|
|
||||||
{
|
|
||||||
reloc_stack[reloc_stack_tos++] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bfd_vma
|
|
||||||
reloc_stack_pop()
|
|
||||||
{
|
|
||||||
return reloc_stack[--reloc_stack_tos];
|
|
||||||
}
|
|
||||||
|
|
||||||
static bfd_vma
|
|
||||||
reloc_stack_operate(unsigned int oper)
|
|
||||||
{
|
|
||||||
bfd_vma value;
|
|
||||||
switch(oper){
|
|
||||||
case 0xE2 :
|
|
||||||
value = reloc_stack[reloc_stack_tos - 2] + reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos -= 2;
|
|
||||||
break;
|
|
||||||
case 0xE3 :
|
|
||||||
value = reloc_stack[reloc_stack_tos - 2] - reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos -= 2;
|
|
||||||
break;
|
|
||||||
case 0xE4 :
|
|
||||||
value = reloc_stack[reloc_stack_tos - 2] * reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos -= 2;
|
|
||||||
break;
|
|
||||||
case 0xE5 :
|
|
||||||
value = reloc_stack[reloc_stack_tos - 2] / reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos -= 2;
|
|
||||||
break;
|
|
||||||
case 0xE6 :
|
|
||||||
value = reloc_stack[reloc_stack_tos - 2] % reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos -= 2;
|
|
||||||
break;
|
|
||||||
case 0xE7 :
|
|
||||||
value = reloc_stack[reloc_stack_tos - 2] << reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos -= 2;
|
|
||||||
break;
|
|
||||||
case 0xE8 :
|
|
||||||
value = reloc_stack[reloc_stack_tos - 2] >> reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos -= 2;
|
|
||||||
break;
|
|
||||||
case 0xE9 :
|
|
||||||
value = reloc_stack[reloc_stack_tos - 2] & reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos -= 2;
|
|
||||||
break;
|
|
||||||
case 0xEA :
|
|
||||||
value = reloc_stack[reloc_stack_tos - 2] | reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos -= 2;
|
|
||||||
break;
|
|
||||||
case 0xEB :
|
|
||||||
value = reloc_stack[reloc_stack_tos - 2] ^ reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos -= 2;
|
|
||||||
break;
|
|
||||||
case 0xEC :
|
|
||||||
value = reloc_stack[reloc_stack_tos - 2] && reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos -= 2;
|
|
||||||
break;
|
|
||||||
case 0xED :
|
|
||||||
value = reloc_stack[reloc_stack_tos - 2] || reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos -= 2;
|
|
||||||
break;
|
|
||||||
case 0xEF :
|
|
||||||
value = -reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos --;
|
|
||||||
break;
|
|
||||||
case 0xF0 :
|
|
||||||
value = ~reloc_stack[reloc_stack_tos - 1];
|
|
||||||
reloc_stack_tos -= 1;
|
|
||||||
break;
|
|
||||||
default :
|
|
||||||
fprintf(stderr, "bfin relocation : Internal bug\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// now push the new value back on stack
|
|
||||||
reloc_stack_push(value);
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FUNCTION : weak_und_symbol
|
/* FUNCTION : weak_und_symbol
|
||||||
ABSTRACT : return true if symbol is weak and undefined.
|
ABSTRACT : return true if symbol is weak and undefined.
|
||||||
*/
|
*/
|
||||||
@ -534,7 +425,7 @@ dump_symbols(symbols, number_of_symbols);
|
|||||||
* Also note that both the relocatable and absolute versions have this
|
* Also note that both the relocatable and absolute versions have this
|
||||||
* terminator even though the relocatable one doesn't have the GOT!
|
* terminator even though the relocatable one doesn't have the GOT!
|
||||||
*/
|
*/
|
||||||
if (pic_with_got) {
|
if (pic_with_got && !use_resolved) {
|
||||||
unsigned long *lp = (unsigned long *)data;
|
unsigned long *lp = (unsigned long *)data;
|
||||||
/* Should call ntohl(*lp) here but is isn't going to matter */
|
/* Should call ntohl(*lp) here but is isn't going to matter */
|
||||||
while (*lp != 0xffffffff) lp++;
|
while (*lp != 0xffffffff) lp++;
|
||||||
@ -682,16 +573,6 @@ dump_symbols(symbols, number_of_symbols);
|
|||||||
#endif /* USE_V850_RELOCS */
|
#endif /* USE_V850_RELOCS */
|
||||||
|
|
||||||
q = *p;
|
q = *p;
|
||||||
#ifdef TARGET_bfin
|
|
||||||
if ((q->sym_ptr_ptr && *q->sym_ptr_ptr) &&
|
|
||||||
(!is_reloc_stack_empty() && strstr((*(q->sym_ptr_ptr))->name, "operator"))){
|
|
||||||
/* must be an arith reloc ... get the value from the stack */
|
|
||||||
sym_name = (*(q->sym_ptr_ptr))->name;
|
|
||||||
sym_section = reloc_stack_get_section();
|
|
||||||
section_name = reloc_stack_get_section_name();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
if (q->sym_ptr_ptr && *q->sym_ptr_ptr) {
|
if (q->sym_ptr_ptr && *q->sym_ptr_ptr) {
|
||||||
sym_name = (*(q->sym_ptr_ptr))->name;
|
sym_name = (*(q->sym_ptr_ptr))->name;
|
||||||
sym_section = (*(q->sym_ptr_ptr))->section;
|
sym_section = (*(q->sym_ptr_ptr))->section;
|
||||||
@ -705,7 +586,7 @@ dump_symbols(symbols, number_of_symbols);
|
|||||||
/* Adjust the address to account for the GOT table which wasn't
|
/* Adjust the address to account for the GOT table which wasn't
|
||||||
* present in the relative file link.
|
* present in the relative file link.
|
||||||
*/
|
*/
|
||||||
if (pic_with_got)
|
if (pic_with_got && !use_resolved)
|
||||||
q->address += got_size;
|
q->address += got_size;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -793,7 +674,7 @@ dump_symbols(symbols, number_of_symbols);
|
|||||||
+ lo;
|
+ lo;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
goto bad_v850_reloc_err;
|
goto bad_resolved_reloc;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_V850_LO16:
|
case R_V850_LO16:
|
||||||
@ -807,16 +688,37 @@ dump_symbols(symbols, number_of_symbols);
|
|||||||
&& (p[-1]->addend == p[0]->addend))
|
&& (p[-1]->addend == p[0]->addend))
|
||||||
break; /* not an error */
|
break; /* not an error */
|
||||||
else
|
else
|
||||||
goto bad_v850_reloc_err;
|
goto bad_resolved_reloc;
|
||||||
|
|
||||||
case R_V850_HI16:
|
case R_V850_HI16:
|
||||||
bad_v850_reloc_err:
|
goto bad_resolved_reloc;
|
||||||
printf("ERROR: reloc type %s unsupported in this context\n",
|
default:
|
||||||
q->howto->name);
|
goto good_32bit_resolved_reloc;
|
||||||
bad_relocs++;
|
#elif defined(TARGET_arm)
|
||||||
|
case R_ARM_ABS32:
|
||||||
|
relocation_needed = 1;
|
||||||
break;
|
break;
|
||||||
#endif /* TARGET_V850 */
|
case R_ARM_REL32:
|
||||||
|
case R_ARM_THM_PC11:
|
||||||
|
case R_ARM_THM_PC22:
|
||||||
|
relocation_needed = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
goto bad_resolved_reloc;
|
||||||
|
#elif defined(TARGET_m68k)
|
||||||
|
case R_68K_32:
|
||||||
|
goto good_32bit_resolved_reloc;
|
||||||
|
case R_68K_PC32:
|
||||||
|
case R_68K_PC16:
|
||||||
|
/* The linker has already resolved
|
||||||
|
PC relocs for us. In PIC links,
|
||||||
|
the symbol must be in the data
|
||||||
|
segment. */
|
||||||
|
case R_68K_NONE:
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
goto bad_resolved_reloc;
|
||||||
|
#else
|
||||||
default:
|
default:
|
||||||
/* The default is to assume that the
|
/* The default is to assume that the
|
||||||
relocation is relative and has
|
relocation is relative and has
|
||||||
@ -825,6 +727,9 @@ dump_symbols(symbols, number_of_symbols);
|
|||||||
give an error by default, and
|
give an error by default, and
|
||||||
require `safe' relocations to be
|
require `safe' relocations to be
|
||||||
enumberated explicitly?). */
|
enumberated explicitly?). */
|
||||||
|
goto good_32bit_resolve_reloc;
|
||||||
|
#endif
|
||||||
|
good_32bit_resolved_reloc:
|
||||||
if (bfd_big_endian (abs_bfd))
|
if (bfd_big_endian (abs_bfd))
|
||||||
sym_addr =
|
sym_addr =
|
||||||
(r_mem[0] << 24)
|
(r_mem[0] << 24)
|
||||||
@ -838,12 +743,19 @@ dump_symbols(symbols, number_of_symbols);
|
|||||||
+ (r_mem[2] << 16)
|
+ (r_mem[2] << 16)
|
||||||
+ (r_mem[3] << 24);
|
+ (r_mem[3] << 24);
|
||||||
relocation_needed = 1;
|
relocation_needed = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
bad_resolved_reloc:
|
||||||
|
printf("ERROR: reloc type %s unsupported in this context\n",
|
||||||
|
q->howto->name);
|
||||||
|
bad_relocs++;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Calculate the sym address ourselves. */
|
/* Calculate the sym address ourselves. */
|
||||||
sym_reloc_size = bfd_get_reloc_size(q->howto);
|
sym_reloc_size = bfd_get_reloc_size(q->howto);
|
||||||
|
|
||||||
#if !defined(TARGET_h8300) && !defined(TARGET_e1) && !defined(TARGET_bfin)
|
#if !defined(TARGET_h8300) && !defined(TARGET_e1) && !defined(TARGET_bfin) && !defined(TARGET_m68k)
|
||||||
if (sym_reloc_size != 4) {
|
if (sym_reloc_size != 4) {
|
||||||
printf("ERROR: bad reloc type %d size=%d for symbol=%s\n",
|
printf("ERROR: bad reloc type %d size=%d for symbol=%s\n",
|
||||||
(*p)->howto->type, sym_reloc_size, sym_name);
|
(*p)->howto->type, sym_reloc_size, sym_name);
|
||||||
@ -861,6 +773,7 @@ dump_symbols(symbols, number_of_symbols);
|
|||||||
sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
sym_vma = bfd_section_vma(abs_bfd, sym_section);
|
||||||
sym_addr += sym_vma + q->addend;
|
sym_addr += sym_vma + q->addend;
|
||||||
break;
|
break;
|
||||||
|
case R_68K_PC16:
|
||||||
case R_68K_PC32:
|
case R_68K_PC32:
|
||||||
sym_vma = 0;
|
sym_vma = 0;
|
||||||
sym_addr += sym_vma + q->addend;
|
sym_addr += sym_vma + q->addend;
|
||||||
@ -1278,14 +1191,12 @@ NIOS2_RELOC_ERR:
|
|||||||
sym_addr -= q->address; // make it PC relative
|
sym_addr -= q->address; // make it PC relative
|
||||||
// implicitly assumes code section and symbol section are same
|
// implicitly assumes code section and symbol section are same
|
||||||
break;
|
break;
|
||||||
|
case R_got:
|
||||||
|
/* Ignore these. */
|
||||||
|
break;
|
||||||
|
|
||||||
case R_rimm16:
|
case R_rimm16:
|
||||||
if (is_reloc_stack_empty ())
|
sym_addr += q->addend;
|
||||||
{
|
|
||||||
sym_addr += q->addend;
|
|
||||||
} else {
|
|
||||||
sym_addr = reloc_stack_pop ();
|
|
||||||
}
|
|
||||||
if(weak_und_symbol(sym_section->name, (*(q->sym_ptr_ptr))))
|
if(weak_und_symbol(sym_section->name, (*(q->sym_ptr_ptr))))
|
||||||
continue;
|
continue;
|
||||||
if(0xFFFF0000 & sym_addr){
|
if(0xFFFF0000 & sym_addr){
|
||||||
@ -1315,11 +1226,8 @@ NIOS2_RELOC_ERR:
|
|||||||
else
|
else
|
||||||
hi_lo = FLAT_RELOC_PART_HI;
|
hi_lo = FLAT_RELOC_PART_HI;
|
||||||
|
|
||||||
if (is_reloc_stack_empty ())
|
sym_addr += q->addend;
|
||||||
sym_addr += q->addend;
|
|
||||||
else
|
|
||||||
sym_addr = reloc_stack_pop ();
|
|
||||||
|
|
||||||
flat_relocs = (uint32_t *)
|
flat_relocs = (uint32_t *)
|
||||||
(realloc (flat_relocs, (flat_reloc_count + 2) * sizeof (uint32_t)));
|
(realloc (flat_relocs, (flat_reloc_count + 2) * sizeof (uint32_t)));
|
||||||
reloc_count_incr = 1;
|
reloc_count_incr = 1;
|
||||||
@ -1356,10 +1264,8 @@ NIOS2_RELOC_ERR:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case R_byte4_data:
|
case R_byte4_data:
|
||||||
if (is_reloc_stack_empty ())
|
sym_addr += q->addend;
|
||||||
sym_addr += q->addend;
|
|
||||||
else
|
|
||||||
sym_addr = reloc_stack_pop ();
|
|
||||||
if (weak_und_symbol (sym_section->name, *q->sym_ptr_ptr))
|
if (weak_und_symbol (sym_section->name, *q->sym_ptr_ptr))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -1375,22 +1281,6 @@ NIOS2_RELOC_ERR:
|
|||||||
flat_reloc_count++;
|
flat_reloc_count++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xE0:
|
|
||||||
/* push */
|
|
||||||
sym_addr += q->addend;
|
|
||||||
reloc_stack_push(sym_addr);
|
|
||||||
reloc_stack_set_section(sym_section, section_name);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xE1:
|
|
||||||
/* const */
|
|
||||||
reloc_stack_push(q->addend);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xE2 ... 0xF2:
|
|
||||||
reloc_stack_operate((*p)->howto->type);
|
|
||||||
break;
|
|
||||||
|
|
||||||
#endif //TARGET_bfin
|
#endif //TARGET_bfin
|
||||||
|
|
||||||
#ifdef TARGET_sh
|
#ifdef TARGET_sh
|
||||||
@ -1622,17 +1512,20 @@ DIS29_RELOCATION:
|
|||||||
|
|
||||||
tmp.l = *(unsigned long *)r_mem;
|
tmp.l = *(unsigned long *)r_mem;
|
||||||
hl = tmp.c[i0] | (tmp.c[i1] << 8) | (tmp.c[i2] << 16);
|
hl = tmp.c[i0] | (tmp.c[i1] << 8) | (tmp.c[i2] << 16);
|
||||||
if (((*p)->howto->type != R_ARM_PC24) &&
|
if (use_resolved ||
|
||||||
((*p)->howto->type != R_ARM_PLT32))
|
(((*p)->howto->type != R_ARM_PC24) &&
|
||||||
|
((*p)->howto->type != R_ARM_PLT32)))
|
||||||
hl |= (tmp.c[i3] << 24);
|
hl |= (tmp.c[i3] << 24);
|
||||||
else if (tmp.c[i2] & 0x80)
|
else if (tmp.c[i2] & 0x80)
|
||||||
hl |= 0xff000000; /* sign extend */
|
hl |= 0xff000000; /* sign extend */
|
||||||
hl += sym_addr;
|
if (!use_resolved)
|
||||||
|
hl += sym_addr;
|
||||||
tmp.c[i0] = hl & 0xff;
|
tmp.c[i0] = hl & 0xff;
|
||||||
tmp.c[i1] = (hl >> 8) & 0xff;
|
tmp.c[i1] = (hl >> 8) & 0xff;
|
||||||
tmp.c[i2] = (hl >> 16) & 0xff;
|
tmp.c[i2] = (hl >> 16) & 0xff;
|
||||||
if (((*p)->howto->type != R_ARM_PC24) &&
|
if (use_resolved ||
|
||||||
((*p)->howto->type != R_ARM_PLT32))
|
(((*p)->howto->type != R_ARM_PC24) &&
|
||||||
|
((*p)->howto->type != R_ARM_PLT32)))
|
||||||
tmp.c[i3] = (hl >> 24) & 0xff;
|
tmp.c[i3] = (hl >> 24) & 0xff;
|
||||||
if ((*p)->howto->type == R_ARM_ABS32)
|
if ((*p)->howto->type == R_ARM_ABS32)
|
||||||
*(unsigned long *)r_mem = htonl(hl);
|
*(unsigned long *)r_mem = htonl(hl);
|
||||||
@ -1734,6 +1627,18 @@ DIS29_RELOCATION:
|
|||||||
break;
|
break;
|
||||||
#endif /* TARGET_nios2 */
|
#endif /* TARGET_nios2 */
|
||||||
|
|
||||||
|
#if defined(TARGET_m68k)
|
||||||
|
case R_68K_PC16:
|
||||||
|
if (sym_addr < -0x8000 || sym_addr > 0x7fff) {
|
||||||
|
fprintf (stderr, "Relocation overflow for R_68K_PC16 relocation against %s\n", sym_name);
|
||||||
|
bad_relocs++;
|
||||||
|
} else {
|
||||||
|
r_mem[0] = (sym_addr >> 8) & 0xff;
|
||||||
|
r_mem[1] = sym_addr & 0xff;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* The alignment of the build host
|
/* The alignment of the build host
|
||||||
might be stricter than that of the
|
might be stricter than that of the
|
||||||
@ -1867,7 +1772,7 @@ static void write_zeroes (unsigned long num, FILE *stream)
|
|||||||
if (num > 0) {
|
if (num > 0) {
|
||||||
/* It'd be nice if we could just use fseek, but that doesn't seem to
|
/* It'd be nice if we could just use fseek, but that doesn't seem to
|
||||||
work for stdio output files. */
|
work for stdio output files. */
|
||||||
bzero(zeroes, 1024);
|
memset(zeroes, 0x00, 1024);
|
||||||
while (num > sizeof(zeroes)) {
|
while (num > sizeof(zeroes)) {
|
||||||
fwrite(zeroes, sizeof(zeroes), 1, stream);
|
fwrite(zeroes, sizeof(zeroes), 1, stream);
|
||||||
num -= sizeof(zeroes);
|
num -= sizeof(zeroes);
|
||||||
@ -2157,7 +2062,7 @@ int main(int argc, char *argv[])
|
|||||||
| (compress ? (compress == 2 ? FLAT_FLAG_GZDATA : FLAT_FLAG_GZIP) : 0)
|
| (compress ? (compress == 2 ? FLAT_FLAG_GZDATA : FLAT_FLAG_GZIP) : 0)
|
||||||
);
|
);
|
||||||
hdr.build_date = htonl((unsigned long)time(NULL));
|
hdr.build_date = htonl((unsigned long)time(NULL));
|
||||||
bzero(hdr.filler, sizeof(hdr.filler));
|
memset(hdr.filler, 0x00, sizeof(hdr.filler));
|
||||||
|
|
||||||
for (i=0; i<reloc_len; i++) reloc[i] = htonl(reloc[i]);
|
for (i=0; i<reloc_len; i++) reloc[i] = htonl(reloc[i]);
|
||||||
|
|
||||||
@ -2194,7 +2099,7 @@ int main(int argc, char *argv[])
|
|||||||
pclose(gf); \
|
pclose(gf); \
|
||||||
else \
|
else \
|
||||||
fclose(gf); \
|
fclose(gf); \
|
||||||
if (!(gf = popen(cmd, "wb"))) { \
|
if (!(gf = popen(cmd, "w" BINARY_FILE_OPTS))) { \
|
||||||
fprintf(stderr, "Can't run cmd %s\n", cmd); \
|
fprintf(stderr, "Can't run cmd %s\n", cmd); \
|
||||||
exit(4); \
|
exit(4); \
|
||||||
} \
|
} \
|
||||||
|
@ -25,6 +25,7 @@ SECTIONS {
|
|||||||
W_RODAT *(.rodata)
|
W_RODAT *(.rodata)
|
||||||
W_RODAT *(.rodata1)
|
W_RODAT *(.rodata1)
|
||||||
W_RODAT *(.rodata.*)
|
W_RODAT *(.rodata.*)
|
||||||
|
W_RODAT *(.gnu.linkonce.r*)
|
||||||
|
|
||||||
/* This is special code area at the end of the normal
|
/* This is special code area at the end of the normal
|
||||||
text section. It contains a small lookup table at
|
text section. It contains a small lookup table at
|
||||||
@ -53,7 +54,7 @@ W_RODAT *(.rodata.*)
|
|||||||
R_RODAT *(.rodata)
|
R_RODAT *(.rodata)
|
||||||
R_RODAT *(.rodata1)
|
R_RODAT *(.rodata1)
|
||||||
R_RODAT *(.rodata.*)
|
R_RODAT *(.rodata.*)
|
||||||
*(.gnu.linkonce.r*)
|
R_RODAT *(.gnu.linkonce.r*)
|
||||||
*(.data)
|
*(.data)
|
||||||
*(.data1)
|
*(.data1)
|
||||||
*(.data.*)
|
*(.data.*)
|
||||||
@ -90,15 +91,48 @@ R_RODAT *(.rodata.*)
|
|||||||
. = ALIGN(4) ;
|
. = ALIGN(4) ;
|
||||||
__CTOR_LIST__ = .;
|
__CTOR_LIST__ = .;
|
||||||
LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
|
LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
|
||||||
*(.ctors)
|
SINGLE_LINK: /* gcc uses crtbegin.o to find the start of
|
||||||
|
SINGLE_LINK: the constructors, so we make sure it is
|
||||||
|
SINGLE_LINK: first. Because this is a wildcard, it
|
||||||
|
SINGLE_LINK: doesn't matter if the user does not
|
||||||
|
SINGLE_LINK: actually link against crtbegin.o; the
|
||||||
|
SINGLE_LINK: linker won't look for a file to match a
|
||||||
|
SINGLE_LINK: wildcard. The wildcard also means that it
|
||||||
|
SINGLE_LINK: doesn't matter which directory crtbegin.o
|
||||||
|
SINGLE_LINK: is in. */
|
||||||
|
SINGLE_LINK: KEEP (*crtbegin*.o(.ctors))
|
||||||
|
SINGLE_LINK: /* We don't want to include the .ctor section from
|
||||||
|
SINGLE_LINK: from the crtend.o file until after the sorted ctors.
|
||||||
|
SINGLE_LINK: The .ctor section from the crtend file contains the
|
||||||
|
SINGLE_LINK: end of ctors marker and it must be last */
|
||||||
|
SINGLE_LINK: KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
|
||||||
|
SINGLE_LINK: KEEP (*(SORT(.ctors.*)))
|
||||||
|
KEEP (*(.ctors))
|
||||||
LONG(0)
|
LONG(0)
|
||||||
__CTOR_END__ = .;
|
__CTOR_END__ = .;
|
||||||
__DTOR_LIST__ = .;
|
__DTOR_LIST__ = .;
|
||||||
LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
|
LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
|
||||||
*(.dtors)
|
SINGLE_LINK: KEEP (*crtbegin*.o(.dtors))
|
||||||
|
SINGLE_LINK: KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
|
||||||
|
SINGLE_LINK: KEEP (*(SORT(.dtors.*)))
|
||||||
|
KEEP (*(.dtors))
|
||||||
LONG(0)
|
LONG(0)
|
||||||
__DTOR_END__ = .;
|
__DTOR_END__ = .;
|
||||||
|
|
||||||
|
PROVIDE (__preinit_array_start = .);
|
||||||
|
KEEP (*(.preinit_array))
|
||||||
|
PROVIDE (__preinit_array_end = .);
|
||||||
|
|
||||||
|
PROVIDE (__init_array_start = .);
|
||||||
|
KEEP (*(SORT(.init_array.*)))
|
||||||
|
KEEP (*(.init_array))
|
||||||
|
PROVIDE (__init_array_end = .);
|
||||||
|
|
||||||
|
PROVIDE (__fini_array_start = .);
|
||||||
|
KEEP (*(.fini_array))
|
||||||
|
KEEP (*(SORT(.fini_array.*)))
|
||||||
|
PROVIDE (__fini_array_end = .);
|
||||||
|
|
||||||
. = ALIGN(0x10) ;
|
. = ALIGN(0x10) ;
|
||||||
_edata = . ;
|
_edata = . ;
|
||||||
} > flatmem
|
} > flatmem
|
||||||
|
@ -19,8 +19,10 @@
|
|||||||
/* macros for conversion between host and (internet) network byte order */
|
/* macros for conversion between host and (internet) network byte order */
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
#include <netinet/in.h> /* Consts and structs defined by the internet system */
|
#include <netinet/in.h> /* Consts and structs defined by the internet system */
|
||||||
|
#define BINARY_FILE_OPTS
|
||||||
#else
|
#else
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
|
#define BINARY_FILE_OPTS "b"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* from uClinux-x.x.x/include/linux */
|
/* from uClinux-x.x.x/include/linux */
|
||||||
@ -83,7 +85,7 @@ process_file(char *ifile, char *ofile)
|
|||||||
|
|
||||||
*tfile = *tfile2 = '\0';
|
*tfile = *tfile2 = '\0';
|
||||||
|
|
||||||
if ((ifp = fopen(ifile, "rb")) == NULL) {
|
if ((ifp = fopen(ifile, "r" BINARY_FILE_OPTS)) == NULL) {
|
||||||
fprintf(stderr, "Cannot open %s\n", ifile);
|
fprintf(stderr, "Cannot open %s\n", ifile);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -206,7 +208,7 @@ process_file(char *ifile, char *ofile)
|
|||||||
|
|
||||||
strcpy(tfile, "/tmp/flatXXXXXX");
|
strcpy(tfile, "/tmp/flatXXXXXX");
|
||||||
mkstemp(tfile);
|
mkstemp(tfile);
|
||||||
if ((ofp = fopen(tfile, "wb")) == NULL) {
|
if ((ofp = fopen(tfile, "w" BINARY_FILE_OPTS)) == NULL) {
|
||||||
fprintf(stderr, "Failed to open %s for writing\n", tfile);
|
fprintf(stderr, "Failed to open %s for writing\n", tfile);
|
||||||
unlink(tfile);
|
unlink(tfile);
|
||||||
unlink(tfile2);
|
unlink(tfile2);
|
||||||
@ -231,7 +233,7 @@ process_file(char *ifile, char *ofile)
|
|||||||
mkstemp(tfile2);
|
mkstemp(tfile2);
|
||||||
|
|
||||||
if (old_flags & FLAT_FLAG_GZDATA) {
|
if (old_flags & FLAT_FLAG_GZDATA) {
|
||||||
tfp = fopen(tfile2, "wb");
|
tfp = fopen(tfile2, "w" BINARY_FILE_OPTS);
|
||||||
if (!tfp) {
|
if (!tfp) {
|
||||||
fprintf(stderr, "Failed to open %s for writing\n", tfile2);
|
fprintf(stderr, "Failed to open %s for writing\n", tfile2);
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -242,7 +244,7 @@ process_file(char *ifile, char *ofile)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sprintf(cmd, "gunzip >> %s", tfile2);
|
sprintf(cmd, "gunzip >> %s", tfile2);
|
||||||
tfp = popen(cmd, "wb");
|
tfp = popen(cmd, "w" BINARY_FILE_OPTS);
|
||||||
if(!tfp) {
|
if(!tfp) {
|
||||||
perror("popen");
|
perror("popen");
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -251,7 +253,7 @@ process_file(char *ifile, char *ofile)
|
|||||||
pclose(tfp);
|
pclose(tfp);
|
||||||
|
|
||||||
fclose(ifp);
|
fclose(ifp);
|
||||||
ifp = fopen(tfile2, "rb");
|
ifp = fopen(tfile2, "r" BINARY_FILE_OPTS);
|
||||||
if (!ifp) {
|
if (!ifp) {
|
||||||
fprintf(stderr, "Failed to open %s for reading\n", tfile2);
|
fprintf(stderr, "Failed to open %s for reading\n", tfile2);
|
||||||
unlink(tfile);
|
unlink(tfile);
|
||||||
@ -264,7 +266,7 @@ process_file(char *ifile, char *ofile)
|
|||||||
printf("zflat %s --> %s\n", ifile, ofile);
|
printf("zflat %s --> %s\n", ifile, ofile);
|
||||||
fclose(ofp);
|
fclose(ofp);
|
||||||
sprintf(cmd, "gzip -9 -f >> %s", tfile);
|
sprintf(cmd, "gzip -9 -f >> %s", tfile);
|
||||||
ofp = popen(cmd, "wb");
|
ofp = popen(cmd, "w" BINARY_FILE_OPTS);
|
||||||
ofp_is_pipe = 1;
|
ofp_is_pipe = 1;
|
||||||
} else if (new_flags & FLAT_FLAG_GZDATA) {
|
} else if (new_flags & FLAT_FLAG_GZDATA) {
|
||||||
printf("zflat-data %s --> %s\n", ifile, ofile);
|
printf("zflat-data %s --> %s\n", ifile, ofile);
|
||||||
@ -272,7 +274,7 @@ process_file(char *ifile, char *ofile)
|
|||||||
sizeof(struct flat_hdr));
|
sizeof(struct flat_hdr));
|
||||||
fclose(ofp);
|
fclose(ofp);
|
||||||
sprintf(cmd, "gzip -9 -f >> %s", tfile);
|
sprintf(cmd, "gzip -9 -f >> %s", tfile);
|
||||||
ofp = popen(cmd, "wb");
|
ofp = popen(cmd, "w" BINARY_FILE_OPTS);
|
||||||
ofp_is_pipe = 1;
|
ofp_is_pipe = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,11 @@
|
|||||||
|
|
||||||
LINKER="$0.real" # the original renamed-linker
|
LINKER="$0.real" # the original renamed-linker
|
||||||
ELF2FLT="`expr $0 : '\(.*\)ld'`elf2flt"
|
ELF2FLT="`expr $0 : '\(.*\)ld'`elf2flt"
|
||||||
|
NM="`expr $0 : '\(.*\)ld'`nm"
|
||||||
TOOLDIR="`dirname $0`" # let gcc find the tools for us
|
TOOLDIR="`dirname $0`" # let gcc find the tools for us
|
||||||
|
OBJCOPY="`expr $0 : '\(.*\)ld'`objcopy"
|
||||||
|
[ -f "$OBJCOPY" ] || OBJCOPY="$TOOLDIR/../../bin/@target_alias@-objcopy"
|
||||||
|
OBJDUMP="`expr $OBJCOPY : '\(.*\)objcopy'`objdump"
|
||||||
LDSCRIPTPATH="@binutils_ldscript_dir@" # and the scripts
|
LDSCRIPTPATH="@binutils_ldscript_dir@" # and the scripts
|
||||||
SHARED_ID=""
|
SHARED_ID=""
|
||||||
NEWLDSCRIPT=""
|
NEWLDSCRIPT=""
|
||||||
@ -92,10 +96,11 @@ then
|
|||||||
ARG1="$ARG1 $FINAL_ONLY"
|
ARG1="$ARG1 $FINAL_ONLY"
|
||||||
NEWLDSCRIPT=`mktemp /tmp/flt-XXXXXX`
|
NEWLDSCRIPT=`mktemp /tmp/flt-XXXXXX`
|
||||||
SEDOP=" -e s/^R_RODAT// -e /^W_RODAT/d"
|
SEDOP=" -e s/^R_RODAT// -e /^W_RODAT/d"
|
||||||
|
OBJCOPYOP=""
|
||||||
if [ "$MOVDAT" ]
|
if [ "$MOVDAT" ]
|
||||||
then
|
then
|
||||||
$LINKER -r -d -o "$OFILE.elf2flt" $ARG1 || exit $?
|
$LINKER -r -d -o "$OFILE.elf2flt" $ARG1 || exit $?
|
||||||
if [ "`@target_alias@-objdump -h "$OFILE.elf2flt" | \
|
if [ "`$OBJDUMP -h "$OFILE.elf2flt" | \
|
||||||
egrep -A1 '[.]rodata' | grep RELOC`" ]
|
egrep -A1 '[.]rodata' | grep RELOC`" ]
|
||||||
then
|
then
|
||||||
echo "warning: .rodata section contains relocations"
|
echo "warning: .rodata section contains relocations"
|
||||||
@ -117,6 +122,7 @@ then
|
|||||||
# Non application modules enter via main not _start
|
# Non application modules enter via main not _start
|
||||||
# SEDOP="$SEDOP -e 's/ENTRY (_start)/ENTRY (main)/'"
|
# SEDOP="$SEDOP -e 's/ENTRY (_start)/ENTRY (main)/'"
|
||||||
SEDOP="$SEDOP -e s/\\(ENTRY.\\)(_start)/\1(lib_main)/"
|
SEDOP="$SEDOP -e s/\\(ENTRY.\\)(_start)/\1(lib_main)/"
|
||||||
|
OBJCOPYOP="--localize-hidden --weaken"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Provide the magic parameter that defines the library data segment pointer offset
|
# Provide the magic parameter that defines the library data segment pointer offset
|
||||||
@ -126,6 +132,12 @@ then
|
|||||||
esac
|
esac
|
||||||
ARG1="$ARG1 -defsym $GOT_OFFSET=`expr ${SHARED_ID} '*' -4 - 4`"
|
ARG1="$ARG1 -defsym $GOT_OFFSET=`expr ${SHARED_ID} '*' -4 - 4`"
|
||||||
fi
|
fi
|
||||||
|
if [ "@emit_relocs@" = "yes" ]
|
||||||
|
then
|
||||||
|
SEDOP="$SEDOP -e s/^SINGLE_LINK://"
|
||||||
|
else
|
||||||
|
SEDOP="$SEDOP -e /^SINGLE_LINK:/d"
|
||||||
|
fi
|
||||||
|
|
||||||
# provide a default linker script, we usually need one
|
# provide a default linker script, we usually need one
|
||||||
[ -z "$LDSCRIPT" ] && LDSCRIPT="${LDSCRIPTPATH}/elf2flt.ld"
|
[ -z "$LDSCRIPT" ] && LDSCRIPT="${LDSCRIPTPATH}/elf2flt.ld"
|
||||||
@ -143,23 +155,56 @@ then
|
|||||||
LDSCRIPT="$NEWLDSCRIPT"
|
LDSCRIPT="$NEWLDSCRIPT"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "@got_check@" = "no" ]
|
if [ "@emit_relocs@" = "yes" ]
|
||||||
then
|
then
|
||||||
$LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -d -o "$OFILE.elf" $ARG1 ||exit $?
|
$LINKER $EMUL $SDIRS -T $LDSCRIPT -q -o "$OFILE.gdb" $ARG1 ||exit $?
|
||||||
$LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" $ARG1 ||exit $?
|
RFILE="$OFILE.gdb"
|
||||||
|
FLTFLAGS="$FLTFLAGS -a"
|
||||||
else
|
else
|
||||||
$LINKER $EMUL -r -d -o "$OFILE.elf2flt" $ARG1 ||exit $?
|
if [ "@got_check@" = "no" ]
|
||||||
$LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -o "$OFILE.elf" "$OFILE.elf2flt" ||exit $?
|
then
|
||||||
$LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" "$OFILE.elf2flt" ||exit $?
|
$LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -d -o "$OFILE.elf" $ARG1 ||exit $?
|
||||||
rm -f "$OFILE.elf2flt"
|
$LINKER $EMUL $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 $?
|
||||||
|
rm -f "$OFILE.elf2flt"
|
||||||
|
fi
|
||||||
|
RFILE="$OFILE.elf"
|
||||||
fi
|
fi
|
||||||
if grep _GLOBAL_OFFSET_TABLE_ "$OFILE.gdb" > /dev/null
|
if $NM "$OFILE.gdb" | grep _GLOBAL_OFFSET_TABLE_ > /dev/null
|
||||||
then
|
then
|
||||||
$ELF2FLT $FLTFLAGS -o "$OFILE" -p "$OFILE.gdb" "$OFILE.elf" || exit $?
|
$ELF2FLT $FLTFLAGS -o "$OFILE" -p "$OFILE.gdb" "$RFILE" || exit $?
|
||||||
else
|
else
|
||||||
$ELF2FLT $FLTFLAGS -o "$OFILE" -r "$OFILE.elf" || exit $?
|
$ELF2FLT $FLTFLAGS -o "$OFILE" -r "$RFILE" || exit $?
|
||||||
fi
|
fi
|
||||||
rm -f "$OFILE.elf" # not needed for any reason
|
if [ "$OBJCOPYOP" ]
|
||||||
|
then
|
||||||
|
if $OBJCOPY $OBJCOPYOP --help > /dev/null 2>&1
|
||||||
|
then
|
||||||
|
$OBJCOPY $OBJCOPYOP "$OFILE.gdb" ||exit $?
|
||||||
|
else
|
||||||
|
case " $OBJCOPYOP " in
|
||||||
|
*" --localize-hidden "*)
|
||||||
|
SYMS=`mktemp /tmp/flt-XXXXXX`
|
||||||
|
$OBJDUMP --syms "$OFILE.gdb" > "$SYMS" ||exit $?
|
||||||
|
sed -n 's/.*\(\.hidden\|\.internal\) \(.*\)/-L \2/p' < "$SYMS" > "$SYMS.hidden" ||exit $?
|
||||||
|
if [ -s "$SYMS.hidden" ]
|
||||||
|
then
|
||||||
|
xargs ${VERBOSE:+-t} $OBJCOPY "$OFILE.gdb" < "$SYMS.hidden" ||exit $?
|
||||||
|
fi
|
||||||
|
rm -f "$SYMS" "$SYMS.hidden"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case " $OBJCOPYOP " in
|
||||||
|
*" --weaken "*)
|
||||||
|
$OBJCOPY --weaken "$OFILE.gdb" ||exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
[ "$RFILE" = "$OFILE.gdb" ] || rm -f "$RFILE" # not needed for any reason
|
||||||
rm -f "$NEWLDSCRIPT"
|
rm -f "$NEWLDSCRIPT"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
Loading…
x
Reference in New Issue
Block a user