From 19397422908c5e57387c3ccad9e0c7576a138c64 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 12 Feb 2002 06:31:29 +0000 Subject: [PATCH] Add DT_PPC64_OPD and DT_PPC64_OPDSZ dynamic tags --- bfd/ChangeLog | 22 ++++++++++++++-------- bfd/elf64-ppc.c | 27 ++++++++++++++++++++++----- binutils/ChangeLog | 5 +++++ binutils/readelf.c | 2 ++ include/elf/ChangeLog | 4 ++++ include/elf/ppc.h | 4 ++++ 6 files changed, 51 insertions(+), 13 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 6e48ed993c..a8d4b87d71 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2002-02-12 Alan Modra + + * elf64-ppc.c (ppc64_elf_size_dynamic_sections): Add dynamic + DT_PPC64_OPD and DT_PPC64_OPDSZ tags. + (ppc64_elf_finish_dynamic_sections): Set values for them. + 2002-02-11 Alexandre Oliva * elf32-sh.c: Added missing prototypes. @@ -467,14 +473,14 @@ 2002-01-31 Philipp Thomas - * coff-arm.c (coff_arm_merge_private_bfd_data): Move ERROR - to front of message. Unify messages with elf32-arm.h. Use - commas where neccessary. - * elf32-arm.h (elf32_arm_merge_private_bfd_data): Use all upcase - ERROR in messages. Unify messages with coff-arm.c. Correct - VFP/FPA error message. - (elf32_arm_print_private_bfd_data): Don't mark APCS-26 and - APCS-32 for translation. + * coff-arm.c (coff_arm_merge_private_bfd_data): Move ERROR + to front of message. Unify messages with elf32-arm.h. Use + commas where neccessary. + * elf32-arm.h (elf32_arm_merge_private_bfd_data): Use all upcase + ERROR in messages. Unify messages with coff-arm.c. Correct + VFP/FPA error message. + (elf32_arm_print_private_bfd_data): Don't mark APCS-26 and + APCS-32 for translation. 2002-02-01 Hans-Peter Nilsson diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index a945f5ca43..e0fb9bfaa9 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -156,11 +156,8 @@ static boolean ppc64_elf_finish_dynamic_sections /* Since .opd is an array of descriptors and each entry will end up with identical R_PPC64_RELATIVE relocs, there is really no need to propagate .opd relocs; The dynamic linker should be taught to - relocate .opd without reloc entries. FIXME: the dynamic linker - will need to know where and how large .opd is via a couple of new - DT_PPC64_* tags, or perhaps just with one reloc that specifies the - start of .opd via its offset and the size via its addend. Also, - .opd should be trimmed of unused values. */ + relocate .opd without reloc entries. FIXME: .opd should be trimmed + of unused values. */ #ifndef NO_OPD_RELOCS #define NO_OPD_RELOCS 0 #endif @@ -3128,6 +3125,13 @@ ppc64_elf_size_dynamic_sections (output_bfd, info) return false; } + if (NO_OPD_RELOCS) + { + if (!add_dynamic_entry (DT_PPC64_OPD, 0) + || !add_dynamic_entry (DT_PPC64_OPDSZ, 0)) + return false; + } + if (relocs) { if (!add_dynamic_entry (DT_RELA, 0) @@ -4354,6 +4358,7 @@ ppc64_elf_finish_dynamic_sections (output_bfd, info) for (; dyncon < dynconend; dyncon++) { Elf_Internal_Dyn dyn; + asection *s; bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn); @@ -4367,6 +4372,18 @@ ppc64_elf_finish_dynamic_sections (output_bfd, info) + htab->sglink->output_offset); break; + case DT_PPC64_OPD: + s = bfd_get_section_by_name (output_bfd, ".opd"); + if (s != NULL) + dyn.d_un.d_ptr = s->vma; + break; + + case DT_PPC64_OPDSZ: + s = bfd_get_section_by_name (output_bfd, ".opd"); + if (s != NULL) + dyn.d_un.d_val = s->_raw_size; + break; + case DT_PLTGOT: dyn.d_un.d_ptr = (htab->splt->output_section->vma + htab->splt->output_offset); diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 54a7c41c04..b3edc015b5 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2002-02-12 Alan Modra + + * readelf.c (get_ppc64_dynamic_type): Handle DT_PPC64_OPD and + DT_PPC64_OPDSZ. + 2002-02-11 Daniel Jacobowitz * MAINTAINERS: List myself as branch maintainer. diff --git a/binutils/readelf.c b/binutils/readelf.c index e80a69d728..0c95f05d88 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -1193,6 +1193,8 @@ get_ppc64_dynamic_type (type) switch (type) { case DT_PPC64_GLINK: return "PPC64_GLINK"; + case DT_PPC64_OPD: return "PPC64_OPD"; + case DT_PPC64_OPDSZ: return "PPC64_OPDSZ"; default: return NULL; } diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog index 79f99ac64e..f0e04db5de 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -1,3 +1,7 @@ +2002-02-12 Alan Modra + + * ppc.h (DT_PPC64_OPD, DT_PPC64_OPDSZ): Define. + 2002-02-09 Richard Henderson * alpha.h (R_ALPHA_BRSGP): New. diff --git a/include/elf/ppc.h b/include/elf/ppc.h index 8e4af62fb1..dfb43f46a4 100644 --- a/include/elf/ppc.h +++ b/include/elf/ppc.h @@ -174,6 +174,10 @@ END_RELOC_NUMBERS (R_PPC_max) /* Specify the start of the .glink section. */ #define DT_PPC64_GLINK DT_LOPROC +/* Specify the start and size of the .opd section. */ +#define DT_PPC64_OPD (DT_LOPROC + 1) +#define DT_PPC64_OPDSZ (DT_LOPROC + 2) + /* Processor specific flags for the ELF header e_flags field. */ #define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag. */