diff options
author | Nick Clifton <nickc@redhat.com> | 1999-11-26 09:52:23 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 1999-11-26 09:52:23 +0000 |
commit | 20cfcaae7be9de914b81b35ff98317e33695a60c (patch) | |
tree | 92d51a0aa3cb0b70310d6b2edb148dcfb335c354 /bfd/elf.c | |
parent | ba3d4249ed4eeb5feb360e3c4f53f01f5381de29 (diff) | |
download | gdb-20cfcaae7be9de914b81b35ff98317e33695a60c.zip gdb-20cfcaae7be9de914b81b35ff98317e33695a60c.tar.gz gdb-20cfcaae7be9de914b81b35ff98317e33695a60c.tar.bz2 |
Add support for target specific processing of ELF segments
Diffstat (limited to 'bfd/elf.c')
-rw-r--r-- | bfd/elf.c | 68 |
1 files changed, 51 insertions, 17 deletions
@@ -53,6 +53,7 @@ static boolean assign_section_numbers PARAMS ((bfd *)); static INLINE int sym_is_global PARAMS ((bfd *, asymbol *)); static boolean elf_map_symbols PARAMS ((bfd *)); static bfd_size_type get_program_header_size PARAMS ((bfd *)); +static boolean elfcore_read_notes PARAMS ((bfd *, bfd_vma, bfd_vma)); /* Swap version information in and out. The version information is currently size independent. If that ever changes, this code will @@ -1387,31 +1388,20 @@ _bfd_elf_new_section_hook (abfd, sec) */ boolean -bfd_section_from_phdr (abfd, hdr, index) +_bfd_elf_make_section_from_phdr (abfd, hdr, index, typename) bfd *abfd; Elf_Internal_Phdr *hdr; int index; + const char *typename; { asection *newsect; char *name; - char *typename; char namebuf[64]; int split; split = ((hdr->p_memsz > 0) && (hdr->p_filesz > 0) && (hdr->p_memsz > hdr->p_filesz)); - switch (hdr->p_type) - { - case PT_NULL: typename = "null"; break; - case PT_LOAD: typename = "load"; break; - case PT_DYNAMIC: typename = "dynamic"; break; - case PT_INTERP: typename = "interp"; break; - case PT_NOTE: typename = "note"; break; - case PT_SHLIB: typename = "shlib"; break; - case PT_PHDR: typename = "phdr"; break; - default: typename = "segment"; break; - } sprintf (namebuf, "%s%d%s", typename, index, split ? "a" : ""); name = bfd_alloc (abfd, strlen (namebuf) + 1); if (!name) @@ -1467,6 +1457,52 @@ bfd_section_from_phdr (abfd, hdr, index) return true; } +boolean +bfd_section_from_phdr (abfd, hdr, index) + bfd *abfd; + Elf_Internal_Phdr *hdr; + int index; +{ + struct elf_backend_data *bed; + + switch (hdr->p_type) + { + case PT_NULL: + return _bfd_elf_make_section_from_phdr (abfd, hdr, index, "null"); + + case PT_LOAD: + return _bfd_elf_make_section_from_phdr (abfd, hdr, index, "load"); + + case PT_DYNAMIC: + return _bfd_elf_make_section_from_phdr (abfd, hdr, index, "dynamic"); + + case PT_INTERP: + return _bfd_elf_make_section_from_phdr (abfd, hdr, index, "interp"); + + case PT_NOTE: + if (! _bfd_elf_make_section_from_phdr (abfd, hdr, index, "note")) + return false; + if (! elfcore_read_notes (abfd, hdr->p_offset, hdr->p_filesz)) + return false; + return true; + + case PT_SHLIB: + return _bfd_elf_make_section_from_phdr (abfd, hdr, index, "shlib"); + + case PT_PHDR: + return _bfd_elf_make_section_from_phdr (abfd, hdr, index, "phdr"); + + default: + /* Check for any processor-specific program segment types. + If no handler for them, default to making "segment" sections. */ + bed = get_elf_backend_data (abfd); + if (bed->elf_backend_section_from_phdr) + return (*bed->elf_backend_section_from_phdr) (abfd, hdr, index); + else + return _bfd_elf_make_section_from_phdr (abfd, hdr, index, "segment"); + } +} + /* Initialize REL_HDR, the section-header for new section, containing relocations against ASECT. If USE_RELA_P is true, we use RELA relocations; otherwise, we use REL relocations. */ @@ -5308,6 +5344,8 @@ elfcore_read_notes (abfd, offset, size) } +/* FIXME: This function is now unnecessary. Callers can just call + bfd_section_from_phdr directly. */ boolean _bfd_elfcore_section_from_phdr (abfd, phdr, sec_num) @@ -5318,10 +5356,6 @@ _bfd_elfcore_section_from_phdr (abfd, phdr, sec_num) if (! bfd_section_from_phdr (abfd, phdr, sec_num)) return false; - if (phdr->p_type == PT_NOTE - && ! elfcore_read_notes (abfd, phdr->p_offset, phdr->p_filesz)) - return false; - return true; } |