summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog16
-rw-r--r--bfd/archures.c4
-rw-r--r--bfd/bfd-in2.h4
-rw-r--r--bfd/cpu-s390.c12
-rw-r--r--bfd/elf32-s390.c41
-rw-r--r--bfd/elf64-s390.c2
6 files changed, 67 insertions, 12 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index bfd0a077cdc..4e343e3aeab 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,19 @@
+2002-02-19 Martin Schwidefsky <schwidefsky@de.ibm.com>
+
+ * archures.c (bfd_mach_s390_esa): Rename to bfd_mach_s390_31.
+ (bfd_mach_s390_esame): Rename to bfd_mach_s390_64.
+ * bfd-in2.h: Regenerate.
+ * cpu-s390.c (arch_info_struct): Use renamed architecture defines.
+ Replace architecture name "s390" with "s390:31-bit" and "s390:esame"
+ with "s390:64-bit".
+ * elf32-s390.c (elf_howto_table): Add 32 bit pc relative relocations.
+ (elf_s390_reloc_type_lookup): Likewise.
+ (elf_s390_check_relocs): Likewise.
+ (elf_s390_gc_sweep_hook): Likewise.
+ (elf_s390_relocate_section): Likewise.
+ (elf_s390_object_p): Use renamed architecture define.
+ * elf64-s390.c (elf_s390_object_p): Use renamed architecture define.
+
2002-02-19 Frank Ch. Eigler <fche@redhat.com>
* syms.c (stt[]): Sorted. Added .init/.fini -> "t" mapping.
diff --git a/bfd/archures.c b/bfd/archures.c
index 1caac7ff149..fb2ba9b79e2 100644
--- a/bfd/archures.c
+++ b/bfd/archures.c
@@ -259,8 +259,8 @@ DESCRIPTION
.#define bfd_mach_avr5 5
. bfd_arch_cris, {* Axis CRIS *}
. bfd_arch_s390, {* IBM s390 *}
-.#define bfd_mach_s390_esa 0
-.#define bfd_mach_s390_esame 1
+.#define bfd_mach_s390_31 0
+.#define bfd_mach_s390_64 1
. bfd_arch_openrisc, {* OpenRISC *}
. bfd_arch_mmix, {* Donald Knuth's educational processor. *}
. bfd_arch_xstormy16,
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 83677e9d492..a582806b8e7 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -1638,8 +1638,8 @@ enum bfd_architecture
#define bfd_mach_avr5 5
bfd_arch_cris, /* Axis CRIS */
bfd_arch_s390, /* IBM s390 */
-#define bfd_mach_s390_esa 0
-#define bfd_mach_s390_esame 1
+#define bfd_mach_s390_31 0
+#define bfd_mach_s390_64 1
bfd_arch_openrisc, /* OpenRISC */
bfd_arch_mmix, /* Donald Knuth's educational processor. */
bfd_arch_xstormy16,
diff --git a/bfd/cpu-s390.c b/bfd/cpu-s390.c
index 09ec78d6c80..d537e1257f9 100644
--- a/bfd/cpu-s390.c
+++ b/bfd/cpu-s390.c
@@ -23,15 +23,15 @@
#include "sysdep.h"
#include "libbfd.h"
-const bfd_arch_info_type bfd_s390_esame_arch =
+const bfd_arch_info_type bfd_s390_64_arch =
{
64, /* bits in a word */
64, /* bits in an address */
8, /* bits in a byte */
bfd_arch_s390,
- bfd_mach_s390_esame,
+ bfd_mach_s390_64,
"s390",
- "s390:esame",
+ "s390:64-bit",
3, /* section alignment power */
true, /* the default */
bfd_default_compatible,
@@ -45,12 +45,12 @@ const bfd_arch_info_type bfd_s390_arch =
32, /* bits in an address */
8, /* bits in a byte */
bfd_arch_s390,
- bfd_mach_s390_esa,
+ bfd_mach_s390_31,
"s390",
- "s390:390",
+ "s390:31-bit",
3, /* section alignment power */
true, /* the default */
bfd_default_compatible,
bfd_default_scan,
- &bfd_s390_esame_arch
+ &bfd_s390_64_arch
};
diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c
index 01ce47c3056..1f197b5a49c 100644
--- a/bfd/elf32-s390.c
+++ b/bfd/elf32-s390.c
@@ -111,6 +111,10 @@ static reloc_howto_type elf_howto_table[] =
HOWTO(R_390_PC16, 0, 1, 16, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16", false, 0,0x0000ffff, true),
HOWTO(R_390_PC16DBL, 1, 1, 16, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16DBL", false, 0,0x0000ffff, true),
HOWTO(R_390_PLT16DBL, 1, 1, 16, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT16DBL", false, 0,0x0000ffff, true),
+ HOWTO(R_390_PC32DBL, 1, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC32DBL", false, 0,0xffffffff, true),
+ HOWTO(R_390_PLT32DBL, 1, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT32DBL", false, 0,0xffffffff, true),
+ HOWTO(R_390_GOTPCDBL, 1, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTPCDBL", false, 0,0xffffffff, true),
+ HOWTO(R_390_GOTENT, 1, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTENT", false, 0,0xffffffff, true),
};
/* GNU extension to record C++ vtable hierarchy. */
@@ -166,6 +170,14 @@ elf_s390_reloc_type_lookup (abfd, code)
return &elf_howto_table[(int) R_390_PC16DBL];
case BFD_RELOC_390_PLT16DBL:
return &elf_howto_table[(int) R_390_PLT16DBL];
+ case BFD_RELOC_390_PC32DBL:
+ return &elf_howto_table[(int) R_390_PC32DBL];
+ case BFD_RELOC_390_PLT32DBL:
+ return &elf_howto_table[(int) R_390_PLT32DBL];
+ case BFD_RELOC_390_GOTPCDBL:
+ return &elf_howto_table[(int) R_390_GOTPCDBL];
+ case BFD_RELOC_390_GOTENT:
+ return &elf_howto_table[(int) R_390_GOTENT];
case BFD_RELOC_VTABLE_INHERIT:
return &elf32_s390_vtinherit_howto;
case BFD_RELOC_VTABLE_ENTRY:
@@ -650,6 +662,7 @@ elf_s390_check_relocs (abfd, info, sec, relocs)
case R_390_GOT12:
case R_390_GOT16:
case R_390_GOT32:
+ case R_390_GOTENT:
/* This symbol requires a global offset table entry. */
if (h != NULL)
{
@@ -679,6 +692,7 @@ elf_s390_check_relocs (abfd, info, sec, relocs)
case R_390_GOTOFF:
case R_390_GOTPC:
+ case R_390_GOTPCDBL:
if (htab->sgot == NULL)
{
if (htab->elf.dynobj == NULL)
@@ -689,6 +703,7 @@ elf_s390_check_relocs (abfd, info, sec, relocs)
break;
case R_390_PLT16DBL:
+ case R_390_PLT32DBL:
case R_390_PLT32:
/* This symbol requires a procedure linkage table entry. We
actually build the entry in adjust_dynamic_symbol,
@@ -711,6 +726,7 @@ elf_s390_check_relocs (abfd, info, sec, relocs)
case R_390_32:
case R_390_PC16:
case R_390_PC16DBL:
+ case R_390_PC32DBL:
case R_390_PC32:
if (h != NULL && !info->shared)
{
@@ -752,6 +768,7 @@ elf_s390_check_relocs (abfd, info, sec, relocs)
&& (sec->flags & SEC_ALLOC) != 0
&& ((ELF32_R_TYPE (rel->r_info) != R_390_PC16
&& ELF32_R_TYPE (rel->r_info) != R_390_PC16DBL
+ && ELF32_R_TYPE (rel->r_info) != R_390_PC32DBL
&& ELF32_R_TYPE (rel->r_info) != R_390_PC32)
|| (h != NULL
&& (! info->symbolic
@@ -854,6 +871,7 @@ elf_s390_check_relocs (abfd, info, sec, relocs)
p->count += 1;
if (ELF32_R_TYPE (rel->r_info) == R_390_PC16
|| ELF32_R_TYPE (rel->r_info) == R_390_PC16DBL
+ || ELF32_R_TYPE (rel->r_info) == R_390_PC32DBL
|| ELF32_R_TYPE (rel->r_info) == R_390_PC32)
p->pc_count += 1;
}
@@ -954,6 +972,8 @@ elf_s390_gc_sweep_hook (abfd, info, sec, relocs)
case R_390_GOT32:
case R_390_GOTOFF:
case R_390_GOTPC:
+ case R_390_GOTPCDBL:
+ case R_390_GOTENT:
r_symndx = ELF32_R_SYM (rel->r_info);
if (r_symndx >= symtab_hdr->sh_info)
{
@@ -974,6 +994,7 @@ elf_s390_gc_sweep_hook (abfd, info, sec, relocs)
case R_390_32:
case R_390_PC16:
case R_390_PC16DBL:
+ case R_390_PC32DBL:
case R_390_PC32:
r_symndx = ELF32_R_SYM (rel->r_info);
if (r_symndx >= symtab_hdr->sh_info)
@@ -994,6 +1015,7 @@ elf_s390_gc_sweep_hook (abfd, info, sec, relocs)
{
if (ELF32_R_TYPE (rel->r_info) == R_390_PC16
|| ELF32_R_TYPE (rel->r_info) == R_390_PC16DBL
+ || ELF32_R_TYPE (rel->r_info) == R_390_PC32DBL
|| ELF32_R_TYPE (rel->r_info) == R_390_PC32)
p->pc_count -= 1;
p->count -= 1;
@@ -1005,6 +1027,7 @@ elf_s390_gc_sweep_hook (abfd, info, sec, relocs)
break;
case R_390_PLT16DBL:
+ case R_390_PLT32DBL:
case R_390_PLT32:
r_symndx = ELF32_R_SYM (rel->r_info);
if (r_symndx >= symtab_hdr->sh_info)
@@ -1716,6 +1739,7 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
case R_390_GOT12:
case R_390_GOT16:
case R_390_GOT32:
+ case R_390_GOTENT:
/* Relocation is to the entry for this symbol in the global
offset table. */
if (htab->sgot == NULL)
@@ -1803,6 +1827,16 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
abort ();
relocation = htab->sgot->output_offset + off;
+
+ /*
+ * For @GOTENT the relocation is against the offset between
+ * the instruction and the symbols entry in the GOT and not
+ * between the start of the GOT and the symbols entry. We
+ * add the vma of the GOT to get the correct value.
+ */
+ if (r_type == R_390_GOTENT)
+ relocation += htab->sgot->output_section->vma;
+
break;
case R_390_GOTOFF:
@@ -1818,12 +1852,14 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
break;
case R_390_GOTPC:
+ case R_390_GOTPCDBL:
/* Use global offset table as symbol value. */
relocation = htab->sgot->output_section->vma;
unresolved_reloc = false;
break;
case R_390_PLT16DBL:
+ case R_390_PLT32DBL:
case R_390_PLT32:
/* Relocation is to the entry for this symbol in the
procedure linkage table. */
@@ -1853,6 +1889,7 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
case R_390_32:
case R_390_PC16:
case R_390_PC16DBL:
+ case R_390_PC32DBL:
case R_390_PC32:
/* r_symndx will be zero only for relocs against symbols
from removed linkonce sections, or sections discarded by
@@ -1864,6 +1901,7 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
if ((info->shared
&& ((r_type != R_390_PC16
&& r_type != R_390_PC16DBL
+ && r_type != R_390_PC32DBL
&& r_type != R_390_PC32)
|| (h != NULL
&& h->dynindx != -1
@@ -1909,6 +1947,7 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
&& h->dynindx != -1
&& (r_type == R_390_PC16
|| r_type == R_390_PC16DBL
+ || r_type == R_390_PC32DBL
|| r_type == R_390_PC32
|| !info->shared
|| !info->symbolic
@@ -2375,7 +2414,7 @@ static boolean
elf_s390_object_p (abfd)
bfd *abfd;
{
- return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_esa);
+ return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_31);
}
static boolean
diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c
index f296c3e9131..5be792881c5 100644
--- a/bfd/elf64-s390.c
+++ b/bfd/elf64-s390.c
@@ -2325,7 +2325,7 @@ static boolean
elf_s390_object_p (abfd)
bfd *abfd;
{
- return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_esame);
+ return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_64);
}
/*