bfd/
* 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.
This commit is contained in:
parent
4724d37ec2
commit
a3f548ed85
2 changed files with 20 additions and 2 deletions
|
@ -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>
|
2012-11-20 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
PR ld/14862
|
PR ld/14862
|
||||||
|
|
|
@ -42,11 +42,18 @@ segment_executable (struct elf_segment_map *seg)
|
||||||
return FALSE;
|
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
|
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;
|
bfd_boolean any_contents = FALSE;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
if (seg->count == 0 || seg->sections[0]->lma % maxpagesize < sizeof_headers)
|
||||||
|
return FALSE;
|
||||||
for (i = 0; i < seg->count; ++i)
|
for (i = 0; i < seg->count; ++i)
|
||||||
{
|
{
|
||||||
if (seg->sections[i]->flags & SEC_CODE)
|
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 **first_load = NULL;
|
||||||
struct elf_segment_map **last_load = NULL;
|
struct elf_segment_map **last_load = NULL;
|
||||||
bfd_boolean moved_headers = FALSE;
|
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)
|
if (info != NULL && info->user_phdrs)
|
||||||
/* The linker script used PHDRS explicitly, so don't change what the
|
/* 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
|
/* Now that we've noted the first PT_LOAD, we're looking for
|
||||||
the first non-executable PT_LOAD with a nonempty p_filesz. */
|
the first non-executable PT_LOAD with a nonempty p_filesz. */
|
||||||
else if (!moved_headers
|
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!
|
/* This is the one we were looking for!
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue