diff options
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elf-nacl.c | 14 |
2 files changed, 20 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 755e747..96fdcd4 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2012-11-21 Roland McGrath <mcgrathr@google.com> + + * elf-nacl.c (segment_nonexecutable_and_has_contents): Renamed to ... + (segment_eligible_for_headers): ... this. Take new arguments + MAXPAGESIZE and SIZEOF_HEADERS. Return false if the first section's + start address doesn't leave space for the headers. + (nacl_modify_segment_map): Update caller. + 2012-11-20 H.J. Lu <hongjiu.lu@intel.com> PR ld/14862 diff --git a/bfd/elf-nacl.c b/bfd/elf-nacl.c index 842e367..04659e7 100644 --- a/bfd/elf-nacl.c +++ b/bfd/elf-nacl.c @@ -42,11 +42,18 @@ segment_executable (struct elf_segment_map *seg) return FALSE; } +/* Determine if this segment is eligible to receive the file and program + headers. It must be non-executable and have contents. Its first + section must start far enough past the page boundary to allow space + for the headers. */ static bfd_boolean -segment_nonexecutable_and_has_contents (struct elf_segment_map *seg) +segment_eligible_for_headers (struct elf_segment_map *seg, + bfd_vma maxpagesize, bfd_vma sizeof_headers) { bfd_boolean any_contents = FALSE; unsigned int i; + if (seg->count == 0 || seg->sections[0]->lma % maxpagesize < sizeof_headers) + return FALSE; for (i = 0; i < seg->count; ++i) { if (seg->sections[i]->flags & SEC_CODE) @@ -68,6 +75,8 @@ nacl_modify_segment_map (bfd *abfd, struct bfd_link_info *info) struct elf_segment_map **first_load = NULL; struct elf_segment_map **last_load = NULL; bfd_boolean moved_headers = FALSE; + int sizeof_headers = bfd_sizeof_headers (abfd, info); + bfd_vma maxpagesize = get_elf_backend_data (abfd)->maxpagesize; if (info != NULL && info->user_phdrs) /* The linker script used PHDRS explicitly, so don't change what the @@ -93,7 +102,8 @@ nacl_modify_segment_map (bfd *abfd, struct bfd_link_info *info) /* Now that we've noted the first PT_LOAD, we're looking for the first non-executable PT_LOAD with a nonempty p_filesz. */ else if (!moved_headers - && segment_nonexecutable_and_has_contents (seg)) + && segment_eligible_for_headers (seg, maxpagesize, + sizeof_headers)) { /* This is the one we were looking for! |