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:
Alan Modra 1999-09-18 00:44:47 +00:00
parent 9f5b33d795
commit b7be1db6b5
7 changed files with 132 additions and 107 deletions

View file

@ -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

View file

@ -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
}; };

View file

@ -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*.

View file

@ -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"
} }

View file

@ -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

View file

@ -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.

View file

@ -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"