Commit e0b4700a authored by Mike Frysinger's avatar Mike Frysinger
Browse files

pull from uClinux CVS

parent ee9c0284
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -5,13 +5,13 @@
/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/
/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/
/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.15/Result of merge/-ko/
/configure.in/1.8/Mon Feb  6 05:04:36 2006/-ko/
/ld-elf2flt.in/1.11/Mon Feb  6 05:04:36 2006//
/configure/1.9/Mon Feb  6 05:05:05 2006/-ko/
/Makefile.in/1.17/Result of merge/-ko/
/configure/1.12/Sun Jan 28 05:27:28 2007/-ko/
/configure.in/1.10/Sun Jan 28 05:27:28 2007/-ko/
/elf2flt.c/1.46/Result of merge/-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
+4 −4
Original line number Diff line number Diff line
@@ -66,10 +66,10 @@ install:
	$(INSTALL) -d $(bindir)
	$(INSTALL) -d $(target_bindir)
	$(INSTALL) -d $(target_libdir)
	$(INSTALL) -s -m 755 $(PROG_FLTHDR) $(bindir)/$(TARGET)-$(PROG_FLTHDR)
	$(INSTALL) -s -m 755 $(PROG_FLTHDR) $(target_bindir)/$(PROG_FLTHDR)
	$(INSTALL) -s -m 755 $(PROG_ELF2FLT) $(bindir)/$(TARGET)-$(PROG_ELF2FLT)
	$(INSTALL) -s -m 755 $(PROG_ELF2FLT) $(target_bindir)/$(PROG_ELF2FLT)
	$(INSTALL) -m 755 $(PROG_FLTHDR) $(bindir)/$(TARGET)-$(PROG_FLTHDR)
	$(INSTALL) -m 755 $(PROG_FLTHDR) $(target_bindir)/$(PROG_FLTHDR)
	$(INSTALL) -m 755 $(PROG_ELF2FLT) $(bindir)/$(TARGET)-$(PROG_ELF2FLT)
	$(INSTALL) -m 755 $(PROG_ELF2FLT) $(target_bindir)/$(PROG_ELF2FLT)
	[ -f $(bindir)/$(TARGET)-ld.real$(EXEEXT) ] || \
		mv $(bindir)/$(TARGET)-ld$(EXEEXT) $(bindir)/$(TARGET)-ld.real$(EXEEXT)
	[ -f $(target_bindir)/ld.real$(EXEEXT) ] || \
+541 −251

File changed.

Preview size limit exceeded, changes collapsed.

+27 −20
Original line number Diff line number Diff line
@@ -37,6 +37,12 @@ AC_ARG_ENABLE(got-check,
	[ 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_TARGET

@@ -75,29 +81,29 @@ fi
binutils_ldscript_dir="$ac_binutils_ldscript_dir"

if test "$ac_libbfd" = "NONE" -o "$ac_libiberty" = "NONE" ; then
	echo
	echo "You need to specify the location of the libfd.a and libiberty.a"
	echo "host libraries from the binutils package."
	echo
	echo "Run configure again specifying these options:"
	echo
	echo "  ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>"
	echo
	exit 1
	AC_MSG_ERROR([

You need to specify the location of the libfd.a and libiberty.a
host libraries from the binutils package.
	
Run configure again specifying these options:
	
  ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>
])
fi

if test "$ac_bfd_include_dir" = "NONE" ; then
	echo
	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."
	echo "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
	echo "Run configure again specifying these options:"
	echo
	echo "  ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>"
	echo
	exit 1
	AC_MSG_ERROR([

You need to specify the location of the bfd.h header from a
configured/compiled version of the binutils package for your target.
Without this your elf2flt may crash as it will try to use the
systems bfd.h which may be from a different binutils package.

Run configure again specifying these options:

  ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>
])
fi

dnl Checks for header files.
@@ -122,6 +128,7 @@ AC_SUBST(bfd_include_dir)
AC_SUBST(binutils_include_dir)
AC_SUBST(binutils_ldscript_dir)
AC_SUBST(got_check)
AC_SUBST(emit_relocs)

AC_OUTPUT(Makefile ld-elf2flt)
+79 −174
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@
 * ELF format file handling. Extended relocation support for all of
 * 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) 2003, H8 support, ktrace <davidm@snapgear.com>
 * (c) 2003-2004, MicroBlaze support, John Williams <jwilliams@itee.uq.edu.au>
@@ -44,8 +46,10 @@
#include <time.h>
#ifndef WIN32
#include <netinet/in.h> /* Consts and structs defined by the internet system */
#define	BINARY_FILE_OPTS
#else
#include <winsock2.h>
#define	BINARY_FILE_OPTS "b"
#endif

/* from $(INSTALLDIR)/include       */
@@ -306,119 +310,6 @@ add_com_to_bss(asymbol **symbol_table, long number_of_symbols, long bss_len)
}  

#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
   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
   * 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;
    /* Should call ntohl(*lp) here but is isn't going to matter */
    while (*lp != 0xffffffff) lp++;
@@ -682,16 +573,6 @@ dump_symbols(symbols, number_of_symbols);
#endif /* USE_V850_RELOCS */

			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) {
				sym_name = (*(q->sym_ptr_ptr))->name;
				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
			 * present in the relative file link.
			 */
			if (pic_with_got)
			if (pic_with_got && !use_resolved)
			  q->address += got_size;
#endif

@@ -793,7 +674,7 @@ dump_symbols(symbols, number_of_symbols);
								+ lo;
						}
					} else
						goto bad_v850_reloc_err;
						goto bad_resolved_reloc;
					break;

				case R_V850_LO16:
@@ -807,16 +688,37 @@ dump_symbols(symbols, number_of_symbols);
					    && (p[-1]->addend == p[0]->addend))
						break; /* not an error */
					else
						goto bad_v850_reloc_err;
						goto bad_resolved_reloc;

				case R_V850_HI16:
				bad_v850_reloc_err:
					printf("ERROR: reloc type %s unsupported in this context\n",
					       q->howto->name);
					bad_relocs++;
					goto bad_resolved_reloc;
				default:
					goto good_32bit_resolved_reloc;
#elif defined(TARGET_arm)
				case R_ARM_ABS32:
					relocation_needed = 1;
					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:
					/* The default is to assume that the
					   relocation is relative and has
@@ -825,6 +727,9 @@ dump_symbols(symbols, number_of_symbols);
					   give an error by default, and
					   require `safe' relocations to be
					   enumberated explicitly?).  */
					goto good_32bit_resolve_reloc;
#endif
				good_32bit_resolved_reloc:
					if (bfd_big_endian (abs_bfd))
						sym_addr =
							(r_mem[0] << 24)
@@ -838,12 +743,19 @@ dump_symbols(symbols, number_of_symbols);
							+ (r_mem[2] << 16)
							+ (r_mem[3] << 24);
					relocation_needed = 1;
					break;

				bad_resolved_reloc:
					printf("ERROR: reloc type %s unsupported in this context\n",
					       q->howto->name);
					bad_relocs++;
					break;
				}
			} else {
				/* Calculate the sym address ourselves.  */
				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) {
					printf("ERROR: bad reloc type %d size=%d for symbol=%s\n",
							(*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_addr += sym_vma + q->addend;
					break;
				case R_68K_PC16:
				case R_68K_PC32:
					sym_vma = 0;
					sym_addr += sym_vma + q->addend;
@@ -1278,14 +1191,12 @@ NIOS2_RELOC_ERR:
				  sym_addr -= q->address; // make it PC relative 
				  // implicitly assumes code section and symbol section are same
				  break;
				case R_got:
				    /* Ignore these.  */
				    break;

				case R_rimm16:
				    if (is_reloc_stack_empty ())
				    {
				    sym_addr += q->addend;
				    } else {
					sym_addr = reloc_stack_pop ();
				    }
				    if(weak_und_symbol(sym_section->name, (*(q->sym_ptr_ptr))))
					continue;
				    if(0xFFFF0000 & sym_addr){
@@ -1315,10 +1226,7 @@ NIOS2_RELOC_ERR:
				    else
					hi_lo = FLAT_RELOC_PART_HI;
				
				    if (is_reloc_stack_empty ())
				    sym_addr += q->addend;
				    else
					sym_addr = reloc_stack_pop ();

				    flat_relocs = (uint32_t *)
					(realloc (flat_relocs, (flat_reloc_count + 2) * sizeof (uint32_t)));
@@ -1356,10 +1264,8 @@ NIOS2_RELOC_ERR:
				    break;
				}
				case R_byte4_data:
				    if (is_reloc_stack_empty ())
				    sym_addr += q->addend;
				    else
					sym_addr = reloc_stack_pop ();

				    if (weak_und_symbol (sym_section->name, *q->sym_ptr_ptr))
					continue;

@@ -1375,22 +1281,6 @@ NIOS2_RELOC_ERR:
				    flat_reloc_count++;
				    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

#ifdef TARGET_sh
@@ -1622,17 +1512,20 @@ DIS29_RELOCATION:

				tmp.l = *(unsigned long *)r_mem;
				hl = tmp.c[i0] | (tmp.c[i1] << 8) | (tmp.c[i2] << 16);
				if (((*p)->howto->type != R_ARM_PC24) &&
				    ((*p)->howto->type != R_ARM_PLT32))
				if (use_resolved ||
					(((*p)->howto->type != R_ARM_PC24) &&
					((*p)->howto->type != R_ARM_PLT32)))
					hl |= (tmp.c[i3] << 24);
				else if (tmp.c[i2] & 0x80)
					hl |= 0xff000000; /* sign extend */
				if (!use_resolved)
					hl += sym_addr;
				tmp.c[i0] = hl & 0xff;
				tmp.c[i1] = (hl >> 8) & 0xff;
				tmp.c[i2] = (hl >> 16) & 0xff;
				if (((*p)->howto->type != R_ARM_PC24) &&
				    ((*p)->howto->type != R_ARM_PLT32))
				if (use_resolved ||
					(((*p)->howto->type != R_ARM_PC24) &&
					((*p)->howto->type != R_ARM_PLT32)))
					tmp.c[i3] = (hl >> 24) & 0xff;
				if ((*p)->howto->type == R_ARM_ABS32)
					*(unsigned long *)r_mem = htonl(hl);
@@ -1734,6 +1627,18 @@ DIS29_RELOCATION:
					break;
#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:
					/* The alignment of the build host
					   might be stricter than that of the
@@ -1867,7 +1772,7 @@ static void write_zeroes (unsigned long num, FILE *stream)
  if (num > 0) {
    /* It'd be nice if we could just use fseek, but that doesn't seem to
       work for stdio output files.  */
    bzero(zeroes, 1024);
    memset(zeroes, 0x00, 1024);
    while (num > sizeof(zeroes)) {
      fwrite(zeroes, sizeof(zeroes), 1, stream);
      num -= sizeof(zeroes);
@@ -2157,7 +2062,7 @@ int main(int argc, char *argv[])
	  | (compress ? (compress == 2 ? FLAT_FLAG_GZDATA : FLAT_FLAG_GZIP) : 0)
	  );
  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]);

@@ -2194,7 +2099,7 @@ int main(int argc, char *argv[])
				pclose(gf); \
			else \
				fclose(gf); \
		if (!(gf = popen(cmd, "wb"))) { \
		if (!(gf = popen(cmd, "w" BINARY_FILE_OPTS))) { \
			fprintf(stderr, "Can't run cmd %s\n", cmd); \
			exit(4); \
		} \
Loading