From 2ea37f1c66300870024a9a9393c4b19337363d8b Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 31 Dec 2007 11:01:54 +0000 Subject: [PATCH] * elf.c (_bfd_elf_find_segment_containing_section): New function: Scan the segment map looking for the segment containing a specified function. * elf-bfd.h: Prototype the new function. * elf-hppa.h (elf_hppa_osec_to_segment): Delete. (elf_hppa_record_segment_addrs): Use new function. * elf32-bfin.c (_bfdfdpic_osec_to_segment): Use new function. * elf32-frv.c (_frvfdpic_osec_to_segment): Use new function. * elf32-hppa.c (hppa_record_segment_addr): Use new function. * elfxx-ia64.c (elfNN_ia64_relocate_section): Use new function. --- bfd/ChangeLog | 13 +++++++++++++ bfd/elf-bfd.h | 3 +++ bfd/elf-hppa.h | 37 ++++++------------------------------- bfd/elf.c | 23 +++++++++++++++++++++++ bfd/elf32-bfin.c | 21 ++------------------- bfd/elf32-frv.c | 21 ++------------------- bfd/elf32-hppa.c | 12 +++++++----- bfd/elfxx-ia64.c | 19 +++---------------- 8 files changed, 59 insertions(+), 90 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 546dfaf..d12d615 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,16 @@ +2007-12-31 Nick Clifton + + * elf.c (_bfd_elf_find_segment_containing_section): New function: + Scan the segment map looking for the segment containing a + specified function. + * elf-bfd.h: Prototype the new function. + * elf-hppa.h (elf_hppa_osec_to_segment): Delete. + (elf_hppa_record_segment_addrs): Use new function. + * elf32-bfin.c (_bfdfdpic_osec_to_segment): Use new function. + * elf32-frv.c (_frvfdpic_osec_to_segment): Use new function. + * elf32-hppa.c (hppa_record_segment_addr): Use new function. + * elfxx-ia64.c (elfNN_ia64_relocate_section): Use new function. + 2007-12-28 John David Anglin PR binutils/5146 diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 918eec3..dc9f153 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -2076,6 +2076,9 @@ extern bfd_boolean _bfd_elf_map_sections_to_segments extern bfd_boolean _bfd_elf_is_function_type (unsigned int); +extern Elf_Internal_Phdr * _bfd_elf_find_segment_containing_section + (bfd * abfd, asection * section); + /* Exported interface for writing elf corefile notes. */ extern char *elfcore_write_note (bfd *, char *, int *, const char *, int, const void *, int); diff --git a/bfd/elf-hppa.h b/bfd/elf-hppa.h index a7850ce..c82264b 100644 --- a/bfd/elf-hppa.h +++ b/bfd/elf-hppa.h @@ -1088,35 +1088,6 @@ elf_hppa_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec) return TRUE; } -/* Find the segment number in which OSEC, and output section, is - located. */ - -static unsigned -elf_hppa_osec_to_segment (bfd *output_bfd, asection *osec) -{ - struct elf_segment_map *m; - Elf_Internal_Phdr *p; - - /* Find the segment that contains the output_section. */ - for (m = elf_tdata (output_bfd)->segment_map, - p = elf_tdata (output_bfd)->phdr; - m != NULL; - m = m->next, p++) - { - int i; - - for (i = m->count - 1; i >= 0; i--) - if (m->sections[i] == osec) - break; - - if (i >= 0) - break; - } - - BFD_ASSERT (m); - return p - elf_tdata (output_bfd)->phdr; -} - static void elf_hppa_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED) @@ -1337,8 +1308,12 @@ elf_hppa_record_segment_addrs (bfd *abfd, if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD)) { - unsigned seg = elf_hppa_osec_to_segment (abfd, section->output_section); - bfd_vma value = elf_tdata (abfd)->phdr[seg].p_vaddr; + bfd_vma value; + Elf_Internal_Phdr *p; + + p = _bfd_elf_find_segment_containing_section (abfd, section->output_section); + BFD_ASSERT (p != NULL); + value = p->p_vaddr; if (section->flags & SEC_READONLY) { diff --git a/bfd/elf.c b/bfd/elf.c index ce9aa80..6022104 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -3426,6 +3426,29 @@ get_program_header_size (bfd *abfd, struct bfd_link_info *info) return segs * bed->s->sizeof_phdr; } +/* Find the segment that contains the output_section of section. */ + +Elf_Internal_Phdr * +_bfd_elf_find_segment_containing_section (bfd * abfd, asection * section) +{ + struct elf_segment_map *m; + Elf_Internal_Phdr *p; + + for (m = elf_tdata (abfd)->segment_map, + p = elf_tdata (abfd)->phdr; + m != NULL; + m = m->next, p++) + { + int i; + + for (i = m->count - 1; i >= 0; i--) + if (m->sections[i] == section) + return p; + } + + return NULL; +} + /* Create a mapping from a set of sections to a program segment. */ static struct elf_segment_map * diff --git a/bfd/elf32-bfin.c b/bfd/elf32-bfin.c index cff16b1..091e74e 100644 --- a/bfd/elf32-bfin.c +++ b/bfd/elf32-bfin.c @@ -1497,26 +1497,9 @@ _bfinfdpic_add_rofixup (bfd *output_bfd, asection *rofixup, bfd_vma offset, static unsigned _bfinfdpic_osec_to_segment (bfd *output_bfd, asection *osec) { - struct elf_segment_map *m; - Elf_Internal_Phdr *p; - - /* Find the segment that contains the output_section. */ - for (m = elf_tdata (output_bfd)->segment_map, - p = elf_tdata (output_bfd)->phdr; - m != NULL; - m = m->next, p++) - { - int i; - - for (i = m->count - 1; i >= 0; i--) - if (m->sections[i] == osec) - break; - - if (i >= 0) - break; - } + Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section (output_bfd, osec); - return p - elf_tdata (output_bfd)->phdr; + return (p != NULL) ? p - elf_tdata (output_bfd)->phdr : -1; } inline static bfd_boolean diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c index 4fc4359..6ce1b9f 100644 --- a/bfd/elf32-frv.c +++ b/bfd/elf32-frv.c @@ -1341,26 +1341,9 @@ _frvfdpic_add_rofixup (bfd *output_bfd, asection *rofixup, bfd_vma offset, static unsigned _frvfdpic_osec_to_segment (bfd *output_bfd, asection *osec) { - struct elf_segment_map *m; - Elf_Internal_Phdr *p; - - /* Find the segment that contains the output_section. */ - for (m = elf_tdata (output_bfd)->segment_map, - p = elf_tdata (output_bfd)->phdr; - m != NULL; - m = m->next, p++) - { - int i; - - for (i = m->count - 1; i >= 0; i--) - if (m->sections[i] == osec) - break; - - if (i >= 0) - break; - } + Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section (output_bfd, osec); - return p - elf_tdata (output_bfd)->phdr; + return (p != NULL) ? p - elf_tdata (output_bfd)->phdr : -1; } inline static bfd_boolean diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index 6fbcd64..b707345 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -3256,9 +3256,7 @@ elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info) /* Record the lowest address for the data and text segments. */ static void -hppa_record_segment_addr (bfd *abfd, - asection *section, - void *data) +hppa_record_segment_addr (bfd *abfd, asection *section, void *data) { struct elf32_hppa_link_hash_table *htab; @@ -3266,8 +3264,12 @@ hppa_record_segment_addr (bfd *abfd, if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD)) { - unsigned seg = elf_hppa_osec_to_segment (abfd, section->output_section); - bfd_vma value = elf_tdata (abfd)->phdr[seg].p_vaddr; + bfd_vma value; + Elf_Internal_Phdr *p; + + p = _bfd_elf_find_segment_containing_section (abfd, section->output_section); + BFD_ASSERT (p != NULL); + value = p->p_vaddr; if ((section->flags & SEC_READONLY) != 0) { diff --git a/bfd/elfxx-ia64.c b/bfd/elfxx-ia64.c index 5aa1a0a..535b1bc 100644 --- a/bfd/elfxx-ia64.c +++ b/bfd/elfxx-ia64.c @@ -4894,24 +4894,11 @@ elfNN_ia64_relocate_section (bfd *output_bfd, case R_IA64_SEGREL64MSB: case R_IA64_SEGREL64LSB: { - struct elf_segment_map *m; - Elf_Internal_Phdr *p; - /* Find the segment that contains the output_section. */ - for (m = elf_tdata (output_bfd)->segment_map, - p = elf_tdata (output_bfd)->phdr; - m != NULL; - m = m->next, p++) - { - int i; - for (i = m->count - 1; i >= 0; i--) - if (m->sections[i] == input_section->output_section) - break; - if (i >= 0) - break; - } + Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section + (input_bfd, input_section->output_section); - if (m == NULL) + if (p == NULL) { r = bfd_reloc_notsupported; } -- 2.7.4