Support 8 and 16-bit relocs for i386coff. Enable i386 gas testsuite tests
previously disabled for lack of such support. For *-*-linux*libc1 targets, XFAIL a ld testsuite that fails due to a bug in the dynamic linker prior to glibc-2.1.
This commit is contained in:
parent
9f5b33d795
commit
b7be1db6b5
7 changed files with 132 additions and 107 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
1999-09-17 Alan Modra <alan@spri.levels.unisa.edu.au>
|
||||||
|
|
||||||
|
* coff-i386.c (coff_i386_reloc_type_lookup): Support BFD_RELOC_16,
|
||||||
|
BFD_RELOC_16_PCREL, BFD_RELOC_8, BFD_RELOC_8_PCREL relocs.
|
||||||
|
(reloc_howto_type howto_table): Tidy comments and whitespace.
|
||||||
|
|
||||||
1999-09-17 Nick Clifton <nickc@cygnus.com>
|
1999-09-17 Nick Clifton <nickc@cygnus.com>
|
||||||
|
|
||||||
* elf32-arm.h (bfd_elf32_arm_get_bfd_for_interworking): Undo
|
* elf32-arm.h (bfd_elf32_arm_get_bfd_for_interworking): Undo
|
||||||
|
|
208
bfd/coff-i386.c
208
bfd/coff-i386.c
|
@ -37,7 +37,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include "libcoff.h"
|
#include "libcoff.h"
|
||||||
|
|
||||||
static bfd_reloc_status_type coff_i386_reloc
|
static bfd_reloc_status_type coff_i386_reloc
|
||||||
PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
|
PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
|
||||||
static reloc_howto_type *coff_i386_rtype_to_howto
|
static reloc_howto_type *coff_i386_rtype_to_howto
|
||||||
PARAMS ((bfd *, asection *, struct internal_reloc *,
|
PARAMS ((bfd *, asection *, struct internal_reloc *,
|
||||||
|
@ -167,7 +167,7 @@ static boolean in_reloc_p (abfd, howto)
|
||||||
reloc_howto_type *howto;
|
reloc_howto_type *howto;
|
||||||
{
|
{
|
||||||
return ! howto->pc_relative && howto->type != R_IMAGEBASE;
|
return ! howto->pc_relative && howto->type != R_IMAGEBASE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* COFF_WITH_PE */
|
#endif /* COFF_WITH_PE */
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ static boolean in_reloc_p (abfd, howto)
|
||||||
#define PCRELOFFSET false
|
#define PCRELOFFSET false
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static reloc_howto_type howto_table[] =
|
static reloc_howto_type howto_table[] =
|
||||||
{
|
{
|
||||||
EMPTY_HOWTO (0),
|
EMPTY_HOWTO (0),
|
||||||
EMPTY_HOWTO (1),
|
EMPTY_HOWTO (1),
|
||||||
|
@ -183,33 +183,33 @@ static reloc_howto_type howto_table[] =
|
||||||
EMPTY_HOWTO (3),
|
EMPTY_HOWTO (3),
|
||||||
EMPTY_HOWTO (4),
|
EMPTY_HOWTO (4),
|
||||||
EMPTY_HOWTO (5),
|
EMPTY_HOWTO (5),
|
||||||
HOWTO (R_DIR32, /* type */
|
HOWTO (R_DIR32, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
32, /* bitsize */
|
32, /* bitsize */
|
||||||
false, /* pc_relative */
|
false, /* pc_relative */
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_bitfield, /* complain_on_overflow */
|
complain_overflow_bitfield, /* complain_on_overflow */
|
||||||
coff_i386_reloc, /* special_function */
|
coff_i386_reloc, /* special_function */
|
||||||
"dir32", /* name */
|
"dir32", /* name */
|
||||||
true, /* partial_inplace */
|
true, /* partial_inplace */
|
||||||
0xffffffff, /* src_mask */
|
0xffffffff, /* src_mask */
|
||||||
0xffffffff, /* dst_mask */
|
0xffffffff, /* dst_mask */
|
||||||
true), /* pcrel_offset */
|
true), /* pcrel_offset */
|
||||||
/* PE IMAGE_REL_I386_DIR32NB relocation (7). */
|
/* PE IMAGE_REL_I386_DIR32NB relocation (7). */
|
||||||
HOWTO (R_IMAGEBASE, /* type */
|
HOWTO (R_IMAGEBASE, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
32, /* bitsize */
|
32, /* bitsize */
|
||||||
false, /* pc_relative */
|
false, /* pc_relative */
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_bitfield, /* complain_on_overflow */
|
complain_overflow_bitfield, /* complain_on_overflow */
|
||||||
coff_i386_reloc, /* special_function */
|
coff_i386_reloc, /* special_function */
|
||||||
"rva32", /* name */
|
"rva32", /* name */
|
||||||
true, /* partial_inplace */
|
true, /* partial_inplace */
|
||||||
0xffffffff, /* src_mask */
|
0xffffffff, /* src_mask */
|
||||||
0xffffffff, /* dst_mask */
|
0xffffffff, /* dst_mask */
|
||||||
false), /* pcrel_offset */
|
false), /* pcrel_offset */
|
||||||
EMPTY_HOWTO (010),
|
EMPTY_HOWTO (010),
|
||||||
EMPTY_HOWTO (011),
|
EMPTY_HOWTO (011),
|
||||||
EMPTY_HOWTO (012),
|
EMPTY_HOWTO (012),
|
||||||
|
@ -219,87 +219,87 @@ static reloc_howto_type howto_table[] =
|
||||||
EMPTY_HOWTO (016),
|
EMPTY_HOWTO (016),
|
||||||
/* Byte relocation (017). */
|
/* Byte relocation (017). */
|
||||||
HOWTO (R_RELBYTE, /* type */
|
HOWTO (R_RELBYTE, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
0, /* size (0 = byte, 1 = short, 2 = long) */
|
0, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
8, /* bitsize */
|
8, /* bitsize */
|
||||||
false, /* pc_relative */
|
false, /* pc_relative */
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_bitfield, /* complain_on_overflow */
|
complain_overflow_bitfield, /* complain_on_overflow */
|
||||||
coff_i386_reloc, /* special_function */
|
coff_i386_reloc, /* special_function */
|
||||||
"8", /* name */
|
"8", /* name */
|
||||||
true, /* partial_inplace */
|
true, /* partial_inplace */
|
||||||
0x000000ff, /* src_mask */
|
0x000000ff, /* src_mask */
|
||||||
0x000000ff, /* dst_mask */
|
0x000000ff, /* dst_mask */
|
||||||
PCRELOFFSET), /* pcrel_offset */
|
PCRELOFFSET), /* pcrel_offset */
|
||||||
/* 16-bit word relocation (020). */
|
/* 16-bit word relocation (020). */
|
||||||
HOWTO (R_RELWORD, /* type */
|
HOWTO (R_RELWORD, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
1, /* size (0 = byte, 1 = short, 2 = long) */
|
1, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
16, /* bitsize */
|
16, /* bitsize */
|
||||||
false, /* pc_relative */
|
false, /* pc_relative */
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_bitfield, /* complain_on_overflow */
|
complain_overflow_bitfield, /* complain_on_overflow */
|
||||||
coff_i386_reloc, /* special_function */
|
coff_i386_reloc, /* special_function */
|
||||||
"16", /* name */
|
"16", /* name */
|
||||||
true, /* partial_inplace */
|
true, /* partial_inplace */
|
||||||
0x0000ffff, /* src_mask */
|
0x0000ffff, /* src_mask */
|
||||||
0x0000ffff, /* dst_mask */
|
0x0000ffff, /* dst_mask */
|
||||||
PCRELOFFSET), /* pcrel_offset */
|
PCRELOFFSET), /* pcrel_offset */
|
||||||
/* 32-bit longword relocation (021). */
|
/* 32-bit longword relocation (021). */
|
||||||
HOWTO (R_RELLONG, /* type */
|
HOWTO (R_RELLONG, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
32, /* bitsize */
|
32, /* bitsize */
|
||||||
false, /* pc_relative */
|
false, /* pc_relative */
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_bitfield, /* complain_on_overflow */
|
complain_overflow_bitfield, /* complain_on_overflow */
|
||||||
coff_i386_reloc, /* special_function */
|
coff_i386_reloc, /* special_function */
|
||||||
"32", /* name */
|
"32", /* name */
|
||||||
true, /* partial_inplace */
|
true, /* partial_inplace */
|
||||||
0xffffffff, /* src_mask */
|
0xffffffff, /* src_mask */
|
||||||
0xffffffff, /* dst_mask */
|
0xffffffff, /* dst_mask */
|
||||||
PCRELOFFSET), /* pcrel_offset */
|
PCRELOFFSET), /* pcrel_offset */
|
||||||
/* Byte PC relative relocation (022). */
|
/* Byte PC relative relocation (022). */
|
||||||
HOWTO (R_PCRBYTE, /* type */
|
HOWTO (R_PCRBYTE, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
0, /* size (0 = byte, 1 = short, 2 = long) */
|
0, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
8, /* bitsize */
|
8, /* bitsize */
|
||||||
true, /* pc_relative */
|
true, /* pc_relative */
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_signed, /* complain_on_overflow */
|
complain_overflow_signed, /* complain_on_overflow */
|
||||||
coff_i386_reloc, /* special_function */
|
coff_i386_reloc, /* special_function */
|
||||||
"DISP8", /* name */
|
"DISP8", /* name */
|
||||||
true, /* partial_inplace */
|
true, /* partial_inplace */
|
||||||
0x000000ff, /* src_mask */
|
0x000000ff, /* src_mask */
|
||||||
0x000000ff, /* dst_mask */
|
0x000000ff, /* dst_mask */
|
||||||
PCRELOFFSET), /* pcrel_offset */
|
PCRELOFFSET), /* pcrel_offset */
|
||||||
/* 16-bit word PC relative relocation (023). */
|
/* 16-bit word PC relative relocation (023). */
|
||||||
HOWTO (R_PCRWORD, /* type */
|
HOWTO (R_PCRWORD, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
1, /* size (0 = byte, 1 = short, 2 = long) */
|
1, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
16, /* bitsize */
|
16, /* bitsize */
|
||||||
true, /* pc_relative */
|
true, /* pc_relative */
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_signed, /* complain_on_overflow */
|
complain_overflow_signed, /* complain_on_overflow */
|
||||||
coff_i386_reloc, /* special_function */
|
coff_i386_reloc, /* special_function */
|
||||||
"DISP16", /* name */
|
"DISP16", /* name */
|
||||||
true, /* partial_inplace */
|
true, /* partial_inplace */
|
||||||
0x0000ffff, /* src_mask */
|
0x0000ffff, /* src_mask */
|
||||||
0x0000ffff, /* dst_mask */
|
0x0000ffff, /* dst_mask */
|
||||||
PCRELOFFSET), /* pcrel_offset */
|
PCRELOFFSET), /* pcrel_offset */
|
||||||
/* 32-bit longword PC relative relocation (024). */
|
/* 32-bit longword PC relative relocation (024). */
|
||||||
HOWTO (R_PCRLONG, /* type */
|
HOWTO (R_PCRLONG, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||||
32, /* bitsize */
|
32, /* bitsize */
|
||||||
true, /* pc_relative */
|
true, /* pc_relative */
|
||||||
0, /* bitpos */
|
0, /* bitpos */
|
||||||
complain_overflow_signed, /* complain_on_overflow */
|
complain_overflow_signed, /* complain_on_overflow */
|
||||||
coff_i386_reloc, /* special_function */
|
coff_i386_reloc, /* special_function */
|
||||||
"DISP32", /* name */
|
"DISP32", /* name */
|
||||||
true, /* partial_inplace */
|
true, /* partial_inplace */
|
||||||
0xffffffff, /* src_mask */
|
0xffffffff, /* src_mask */
|
||||||
0xffffffff, /* dst_mask */
|
0xffffffff, /* dst_mask */
|
||||||
PCRELOFFSET) /* pcrel_offset */
|
PCRELOFFSET) /* pcrel_offset */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -432,7 +432,7 @@ coff_i386_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
|
||||||
function will be adding in the final value of the symbol. We
|
function will be adding in the final value of the symbol. We
|
||||||
need to subtract out the current size in order to get the
|
need to subtract out the current size in order to get the
|
||||||
correct result. */
|
correct result. */
|
||||||
|
|
||||||
BFD_ASSERT (h != NULL);
|
BFD_ASSERT (h != NULL);
|
||||||
|
|
||||||
#ifndef COFF_WITH_PE
|
#ifndef COFF_WITH_PE
|
||||||
|
@ -451,7 +451,7 @@ coff_i386_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
|
||||||
/* If the output symbol is common (in which case this must be a
|
/* If the output symbol is common (in which case this must be a
|
||||||
relocateable link), we need to add in the final size of the
|
relocateable link), we need to add in the final size of the
|
||||||
common symbol. */
|
common symbol. */
|
||||||
if (h != NULL && h->root.type == bfd_link_hash_common)
|
if (h != NULL && h->root.type == bfd_link_hash_common)
|
||||||
*addendp += h->root.u.c.size;
|
*addendp += h->root.u.c.size;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -489,11 +489,19 @@ coff_i386_reloc_type_lookup (abfd, code)
|
||||||
switch (code)
|
switch (code)
|
||||||
{
|
{
|
||||||
case BFD_RELOC_RVA:
|
case BFD_RELOC_RVA:
|
||||||
return howto_table +R_IMAGEBASE;
|
return howto_table + R_IMAGEBASE;
|
||||||
case BFD_RELOC_32:
|
case BFD_RELOC_32:
|
||||||
return howto_table + R_DIR32;
|
return howto_table + R_DIR32;
|
||||||
case BFD_RELOC_32_PCREL:
|
case BFD_RELOC_32_PCREL:
|
||||||
return howto_table + R_PCRLONG;
|
return howto_table + R_PCRLONG;
|
||||||
|
case BFD_RELOC_16:
|
||||||
|
return howto_table + R_RELWORD;
|
||||||
|
case BFD_RELOC_16_PCREL:
|
||||||
|
return howto_table + R_PCRWORD;
|
||||||
|
case BFD_RELOC_8:
|
||||||
|
return howto_table + R_RELBYTE;
|
||||||
|
case BFD_RELOC_8_PCREL:
|
||||||
|
return howto_table + R_PCRBYTE;
|
||||||
default:
|
default:
|
||||||
BFD_FAIL ();
|
BFD_FAIL ();
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -650,6 +658,6 @@ const bfd_target
|
||||||
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
|
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
|
||||||
|
|
||||||
NULL,
|
NULL,
|
||||||
|
|
||||||
COFF_SWAP_TABLE
|
COFF_SWAP_TABLE
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
1999-09-17 Alan Modra <alan@spri.levels.unisa.edu.au>
|
||||||
|
|
||||||
|
* gas/i386/i386.exp: Enable reloc and white tests for COFF.
|
||||||
|
* gas/i386/reloc.d: Accept dir32 relocs.
|
||||||
|
|
||||||
1999-09-12 Donn Terry <donn@interix.com>
|
1999-09-12 Donn Terry <donn@interix.com>
|
||||||
|
|
||||||
* gas/all/gas.exp: Run cofftag test for i*86-*-interix*.
|
* gas/all/gas.exp: Run cofftag test for i*86-*-interix*.
|
||||||
|
|
|
@ -28,8 +28,8 @@ if [istarget "i*86-*-*"] then {
|
||||||
run_dump_test "katmai"
|
run_dump_test "katmai"
|
||||||
|
|
||||||
# The reloc and white tests require support for 8 and 16 bit
|
# The reloc and white tests require support for 8 and 16 bit
|
||||||
# relocs, so we only run them for ELF targets.
|
# relocs, so we only run them for ELF and COFF targets.
|
||||||
if {[istarget "*-*-elf*"] || [istarget "*-*-linux*"]} then {
|
if {[istarget "*-*-elf*"] || [istarget "*-*-linux*"] || [istarget "*-*-coff*"]} then {
|
||||||
run_dump_test "reloc"
|
run_dump_test "reloc"
|
||||||
run_list_test "white" "-al --listing-lhs-width=3"
|
run_list_test "white" "-al --listing-lhs-width=3"
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,11 +7,11 @@ Disassembly of section .text:
|
||||||
|
|
||||||
0+000 <foo>:
|
0+000 <foo>:
|
||||||
0: b3 00 [ ]*mov \$0x0,%bl 1: (R_386_)?8 .text
|
0: b3 00 [ ]*mov \$0x0,%bl 1: (R_386_)?8 .text
|
||||||
2: 68 00 00 00 00 [ ]*push \$0x0 3: (R_386_)?32 .text
|
2: 68 00 00 00 00 [ ]*push \$0x0 3: (R_386_)?(dir)?32 .text
|
||||||
7: 05 00 00 00 00 [ ]*add \$0x0,%eax 8: (R_386_)?32 .text
|
7: 05 00 00 00 00 [ ]*add \$0x0,%eax 8: (R_386_)?(dir)?32 .text
|
||||||
c: 81 c3 00 00 00 00 [ ]*add \$0x0,%ebx e: (R_386_)?32 .text
|
c: 81 c3 00 00 00 00 [ ]*add \$0x0,%ebx e: (R_386_)?(dir)?32 .text
|
||||||
12: 69 d2 00 00 00 00 [ ]*imul \$0x0,%edx,%edx 14: (R_386_)?32 .text
|
12: 69 d2 00 00 00 00 [ ]*imul \$0x0,%edx,%edx 14: (R_386_)?(dir)?32 .text
|
||||||
18: 9a 00 00 00 00 00 00 [ ]*lcall \$0x0,\$0x0 19: (R_386_)?32 .text
|
18: 9a 00 00 00 00 00 00 [ ]*lcall \$0x0,\$0x0 19: (R_386_)?(dir)?32 .text
|
||||||
1f: 66 68 00 00 [ ]*pushw \$0x0 21: (R_386_)?16 .text
|
1f: 66 68 00 00 [ ]*pushw \$0x0 21: (R_386_)?16 .text
|
||||||
23: 90 [ ]*nop
|
23: 90 [ ]*nop
|
||||||
24: 90 [ ]*nop
|
24: 90 [ ]*nop
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
1999-09-17 Alan Modra <alan@spri.levels.unisa.edu.au>
|
||||||
|
|
||||||
|
* ld-shared/shared.exp: xfail linux*libc1 shared (non PIC, load
|
||||||
|
offset) test.
|
||||||
|
|
||||||
1999-09-12 Ian Lance Taylor <ian@zembu.com>
|
1999-09-12 Ian Lance Taylor <ian@zembu.com>
|
||||||
|
|
||||||
* ld-scripts/script.exp: Add --image-base 0 for PE targets.
|
* ld-scripts/script.exp: Add --image-base 0 for PE targets.
|
||||||
|
|
|
@ -203,6 +203,7 @@ if ![ld_compile "$CC $CFLAGS $SHCFLAG" $srcdir/$subdir/main.c $tmpdir/mainnp.o]
|
||||||
# relocations for various targets are broken in the case where
|
# relocations for various targets are broken in the case where
|
||||||
# the load address is not zero (which is the default).
|
# the load address is not zero (which is the default).
|
||||||
setup_xfail "*-*-sunos4*"
|
setup_xfail "*-*-sunos4*"
|
||||||
|
setup_xfail "*-*-linux*libc1"
|
||||||
shared_test shnp "shared (non PIC, load offset)" \
|
shared_test shnp "shared (non PIC, load offset)" \
|
||||||
mainnp.o sh1np.o sh2np.o shared \
|
mainnp.o sh1np.o sh2np.o shared \
|
||||||
"-T $srcdir/$subdir/elf-offset.ld"
|
"-T $srcdir/$subdir/elf-offset.ld"
|
||||||
|
|
Loading…
Reference in a new issue