aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2012-04-09 16:27:18 +0000
committerRoland McGrath <roland@gnu.org>2012-04-09 16:27:18 +0000
commitd324f6d66ba4ddd975973e0a494c5c9c9be532fc (patch)
tree561e713d099fbd067469d7821b5adde18f21e364 /bfd
parentfb57d4525b04b5fc28dc98c6034aa5c667bbbc71 (diff)
downloadgdb-d324f6d66ba4ddd975973e0a494c5c9c9be532fc.zip
gdb-d324f6d66ba4ddd975973e0a494c5c9c9be532fc.tar.gz
gdb-d324f6d66ba4ddd975973e0a494c5c9c9be532fc.tar.bz2
bfd/
* elf.c (_bfd_elf_map_sections_to_segments): Set INFO->user_phdrs. * elf-nacl.c (nacl_modify_segment_map): Do nothing if INFO->user_phdrs. (nacl_modify_program_headers): Likewise. include/ * bfdlink.h (struct bfd_link_info): Add new member user_phdrs.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf-nacl.c12
-rw-r--r--bfd/elf.c14
3 files changed, 26 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 56a1121..6d12944 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2012-04-09 Roland McGrath <mcgrathr@google.com>
+
+ * elf.c (_bfd_elf_map_sections_to_segments): Set INFO->user_phdrs.
+ * elf-nacl.c (nacl_modify_segment_map): Do nothing if INFO->user_phdrs.
+ (nacl_modify_program_headers): Likewise.
+
2012-04-03 Roland McGrath <mcgrathr@google.com>
* elf-nacl.c: New file.
diff --git a/bfd/elf-nacl.c b/bfd/elf-nacl.c
index 3ba7f55..842e367 100644
--- a/bfd/elf-nacl.c
+++ b/bfd/elf-nacl.c
@@ -62,13 +62,18 @@ segment_nonexecutable_and_has_contents (struct elf_segment_map *seg)
The first non-executable PT_LOAD segment appears first in the file
and contains the ELF file header and phdrs. */
bfd_boolean
-nacl_modify_segment_map (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
+nacl_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
{
struct elf_segment_map **m = &elf_tdata (abfd)->segment_map;
struct elf_segment_map **first_load = NULL;
struct elf_segment_map **last_load = NULL;
bfd_boolean moved_headers = FALSE;
+ if (info != NULL && info->user_phdrs)
+ /* The linker script used PHDRS explicitly, so don't change what the
+ user asked for. */
+ return TRUE;
+
while (*m != NULL)
{
struct elf_segment_map *seg = *m;
@@ -141,6 +146,11 @@ nacl_modify_program_headers (bfd *abfd,
Elf_Internal_Phdr *phdr = elf_tdata (abfd)->phdr;
Elf_Internal_Phdr *p = phdr;
+ if (info != NULL && info->user_phdrs)
+ /* The linker script used PHDRS explicitly, so don't change what the
+ user asked for. */
+ return TRUE;
+
/* Find the PT_LOAD that contains the headers (should be the first). */
while (*m != NULL)
{
diff --git a/bfd/elf.c b/bfd/elf.c
index df43a6a..7faa8f6 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -2527,7 +2527,7 @@ _bfd_elf_init_reloc_shdr (bfd *abfd,
rel_hdr = bfd_zalloc (abfd, amt);
reldata->hdr = rel_hdr;
- amt = sizeof ".rela" + strlen (asect->name);
+ amt = sizeof ".rela" + strlen (asect->name);
name = (char *) bfd_alloc (abfd, amt);
if (name == NULL)
return FALSE;
@@ -3744,6 +3744,10 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
bfd_boolean no_user_phdrs;
no_user_phdrs = elf_tdata (abfd)->segment_map == NULL;
+
+ if (info != NULL)
+ info->user_phdrs = !no_user_phdrs;
+
if (no_user_phdrs && bfd_count_sections (abfd) != 0)
{
asection *s;
@@ -4351,7 +4355,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
elf_elfheader (abfd)->e_phoff = 0;
elf_elfheader (abfd)->e_phentsize = 0;
}
-
+
elf_elfheader (abfd)->e_phnum = alloc;
if (elf_tdata (abfd)->program_header_size == (bfd_size_type) -1)
@@ -5428,7 +5432,7 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
1. It is within the address space of the segment -- we use the LMA
if that is set for the segment and the VMA otherwise,
2. It is an allocated section or a NOTE section in a PT_NOTE
- segment.
+ segment.
3. There is an output section associated with it,
4. The section has not already been allocated to a previous segment.
5. PT_GNU_STACK segments do not include any sections.
@@ -6148,7 +6152,7 @@ copy_elf_program_header (bfd *ibfd, bfd *obfd)
if (map->includes_filehdr && lowest_section != NULL)
/* We need to keep the space used by the headers fixed. */
map->header_size = lowest_section->vma - segment->p_vaddr;
-
+
if (!map->includes_phdrs
&& !map->includes_filehdr
&& map->p_paddr_valid)
@@ -9633,7 +9637,7 @@ _bfd_elf_get_synthetic_symtab (bfd *abfd,
if (p->addend != 0)
{
char buf[30], *a;
-
+
memcpy (names, "+0x", sizeof ("+0x") - 1);
names += sizeof ("+0x") - 1;
bfd_sprintf_vma (abfd, buf, p->addend);