From 590c207e036c9fe05fa70f7958ca08cf7563e9c1 Mon Sep 17 00:00:00 2001 From: amodra Date: Sat, 18 Sep 1999 00:44:43 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 6 ++ bfd/coff-i386.c | 208 ++++++++++++++++++++------------------ gas/testsuite/ChangeLog | 5 + gas/testsuite/gas/i386/i386.exp | 4 +- gas/testsuite/gas/i386/reloc.d | 10 +- ld/testsuite/ChangeLog | 5 + ld/testsuite/ld-shared/shared.exp | 1 + 7 files changed, 132 insertions(+), 107 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 6c07ea28a6..503f159087 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +1999-09-17 Alan Modra + + * 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 * elf32-arm.h (bfd_elf32_arm_get_bfd_for_interworking): Undo diff --git a/bfd/coff-i386.c b/bfd/coff-i386.c index f7eb1f517b..a463e58b07 100644 --- a/bfd/coff-i386.c +++ b/bfd/coff-i386.c @@ -37,7 +37,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #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 **)); static reloc_howto_type *coff_i386_rtype_to_howto PARAMS ((bfd *, asection *, struct internal_reloc *, @@ -167,7 +167,7 @@ static boolean in_reloc_p (abfd, howto) reloc_howto_type *howto; { return ! howto->pc_relative && howto->type != R_IMAGEBASE; -} +} #endif /* COFF_WITH_PE */ @@ -175,7 +175,7 @@ static boolean in_reloc_p (abfd, howto) #define PCRELOFFSET false #endif -static reloc_howto_type howto_table[] = +static reloc_howto_type howto_table[] = { EMPTY_HOWTO (0), EMPTY_HOWTO (1), @@ -183,33 +183,33 @@ static reloc_howto_type howto_table[] = EMPTY_HOWTO (3), EMPTY_HOWTO (4), EMPTY_HOWTO (5), - HOWTO (R_DIR32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ + HOWTO (R_DIR32, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 32, /* bitsize */ + false, /* pc_relative */ + 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "dir32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - true), /* pcrel_offset */ - /* PE IMAGE_REL_I386_DIR32NB relocation (7). */ - HOWTO (R_IMAGEBASE, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ + coff_i386_reloc, /* special_function */ + "dir32", /* name */ + true, /* partial_inplace */ + 0xffffffff, /* src_mask */ + 0xffffffff, /* dst_mask */ + true), /* pcrel_offset */ + /* PE IMAGE_REL_I386_DIR32NB relocation (7). */ + HOWTO (R_IMAGEBASE, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 32, /* bitsize */ + false, /* pc_relative */ + 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "rva32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ + coff_i386_reloc, /* special_function */ + "rva32", /* name */ + true, /* partial_inplace */ + 0xffffffff, /* src_mask */ + 0xffffffff, /* dst_mask */ + false), /* pcrel_offset */ EMPTY_HOWTO (010), EMPTY_HOWTO (011), EMPTY_HOWTO (012), @@ -219,87 +219,87 @@ static reloc_howto_type howto_table[] = EMPTY_HOWTO (016), /* Byte relocation (017). */ HOWTO (R_RELBYTE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ + 0, /* rightshift */ + 0, /* size (0 = byte, 1 = short, 2 = long) */ + 8, /* bitsize */ + false, /* pc_relative */ + 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "8", /* name */ - true, /* partial_inplace */ - 0x000000ff, /* src_mask */ - 0x000000ff, /* dst_mask */ + coff_i386_reloc, /* special_function */ + "8", /* name */ + true, /* partial_inplace */ + 0x000000ff, /* src_mask */ + 0x000000ff, /* dst_mask */ PCRELOFFSET), /* pcrel_offset */ /* 16-bit word relocation (020). */ - HOWTO (R_RELWORD, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ + HOWTO (R_RELWORD, /* type */ + 0, /* rightshift */ + 1, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + false, /* pc_relative */ + 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "16", /* name */ - true, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ + coff_i386_reloc, /* special_function */ + "16", /* name */ + true, /* partial_inplace */ + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ PCRELOFFSET), /* pcrel_offset */ - /* 32-bit longword relocation (021). */ - HOWTO (R_RELLONG, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ + /* 32-bit longword relocation (021). */ + HOWTO (R_RELLONG, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 32, /* bitsize */ + false, /* pc_relative */ + 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ + coff_i386_reloc, /* special_function */ + "32", /* name */ + true, /* partial_inplace */ + 0xffffffff, /* src_mask */ + 0xffffffff, /* dst_mask */ PCRELOFFSET), /* pcrel_offset */ - /* Byte PC relative relocation (022). */ - HOWTO (R_PCRBYTE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ + /* Byte PC relative relocation (022). */ + HOWTO (R_PCRBYTE, /* type */ + 0, /* rightshift */ + 0, /* size (0 = byte, 1 = short, 2 = long) */ + 8, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "DISP8", /* name */ - true, /* partial_inplace */ - 0x000000ff, /* src_mask */ - 0x000000ff, /* dst_mask */ + coff_i386_reloc, /* special_function */ + "DISP8", /* name */ + true, /* partial_inplace */ + 0x000000ff, /* src_mask */ + 0x000000ff, /* dst_mask */ PCRELOFFSET), /* pcrel_offset */ - /* 16-bit word PC relative relocation (023). */ - HOWTO (R_PCRWORD, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ + /* 16-bit word PC relative relocation (023). */ + HOWTO (R_PCRWORD, /* type */ + 0, /* rightshift */ + 1, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "DISP16", /* name */ - true, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ + coff_i386_reloc, /* special_function */ + "DISP16", /* name */ + true, /* partial_inplace */ + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ PCRELOFFSET), /* pcrel_offset */ /* 32-bit longword PC relative relocation (024). */ - HOWTO (R_PCRLONG, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ + HOWTO (R_PCRLONG, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 32, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "DISP32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ + coff_i386_reloc, /* special_function */ + "DISP32", /* name */ + true, /* partial_inplace */ + 0xffffffff, /* src_mask */ + 0xffffffff, /* dst_mask */ 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 need to subtract out the current size in order to get the correct result. */ - + BFD_ASSERT (h != NULL); #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 relocateable link), we need to add in the final size of the 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; #endif @@ -489,11 +489,19 @@ coff_i386_reloc_type_lookup (abfd, code) switch (code) { case BFD_RELOC_RVA: - return howto_table +R_IMAGEBASE; + return howto_table + R_IMAGEBASE; case BFD_RELOC_32: return howto_table + R_DIR32; case BFD_RELOC_32_PCREL: 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: BFD_FAIL (); return 0; @@ -650,6 +658,6 @@ const bfd_target BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), NULL, - + COFF_SWAP_TABLE }; diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 42e87c92b4..c400d61cf9 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +1999-09-17 Alan Modra + + * gas/i386/i386.exp: Enable reloc and white tests for COFF. + * gas/i386/reloc.d: Accept dir32 relocs. + 1999-09-12 Donn Terry * gas/all/gas.exp: Run cofftag test for i*86-*-interix*. diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index 25ed69fcb9..94011364a6 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -28,8 +28,8 @@ if [istarget "i*86-*-*"] then { run_dump_test "katmai" # The reloc and white tests require support for 8 and 16 bit - # relocs, so we only run them for ELF targets. - if {[istarget "*-*-elf*"] || [istarget "*-*-linux*"]} then { + # relocs, so we only run them for ELF and COFF targets. + if {[istarget "*-*-elf*"] || [istarget "*-*-linux*"] || [istarget "*-*-coff*"]} then { run_dump_test "reloc" run_list_test "white" "-al --listing-lhs-width=3" } diff --git a/gas/testsuite/gas/i386/reloc.d b/gas/testsuite/gas/i386/reloc.d index b3b6febc1c..3a95eed828 100644 --- a/gas/testsuite/gas/i386/reloc.d +++ b/gas/testsuite/gas/i386/reloc.d @@ -7,11 +7,11 @@ Disassembly of section .text: 0+000 : 0: b3 00 [ ]*mov \$0x0,%bl 1: (R_386_)?8 .text - 2: 68 00 00 00 00 [ ]*push \$0x0 3: (R_386_)?32 .text - 7: 05 00 00 00 00 [ ]*add \$0x0,%eax 8: (R_386_)?32 .text - c: 81 c3 00 00 00 00 [ ]*add \$0x0,%ebx e: (R_386_)?32 .text - 12: 69 d2 00 00 00 00 [ ]*imul \$0x0,%edx,%edx 14: (R_386_)?32 .text - 18: 9a 00 00 00 00 00 00 [ ]*lcall \$0x0,\$0x0 19: (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_)?(dir)?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_)?(dir)?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 23: 90 [ ]*nop 24: 90 [ ]*nop diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 9bb2008f98..650d3258ff 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,8 @@ +1999-09-17 Alan Modra + + * ld-shared/shared.exp: xfail linux*libc1 shared (non PIC, load + offset) test. + 1999-09-12 Ian Lance Taylor * ld-scripts/script.exp: Add --image-base 0 for PE targets. diff --git a/ld/testsuite/ld-shared/shared.exp b/ld/testsuite/ld-shared/shared.exp index 6c099a5372..6eb0a8c5a7 100644 --- a/ld/testsuite/ld-shared/shared.exp +++ b/ld/testsuite/ld-shared/shared.exp @@ -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 # the load address is not zero (which is the default). setup_xfail "*-*-sunos4*" + setup_xfail "*-*-linux*libc1" shared_test shnp "shared (non PIC, load offset)" \ mainnp.o sh1np.o sh2np.o shared \ "-T $srcdir/$subdir/elf-offset.ld" -- 2.11.0