summaryrefslogtreecommitdiffstats
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>1999-11-26 09:52:23 +0000
committerNick Clifton <nickc@redhat.com>1999-11-26 09:52:23 +0000
commit20cfcaae7be9de914b81b35ff98317e33695a60c (patch)
tree92d51a0aa3cb0b70310d6b2edb148dcfb335c354 /bfd/elf.c
parentba3d4249ed4eeb5feb360e3c4f53f01f5381de29 (diff)
downloadppe42-binutils-20cfcaae7be9de914b81b35ff98317e33695a60c.tar.gz
ppe42-binutils-20cfcaae7be9de914b81b35ff98317e33695a60c.zip
Add support for target specific processing of ELF segments
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c68
1 files changed, 51 insertions, 17 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index ccfb00e325..d957476d79 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -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;
}
OpenPOWER on IntegriCloud