* 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.
This commit is contained in:
Roland McGrath 2012-04-09 16:27:18 +00:00
parent fb57d4525b
commit d324f6d66b
5 changed files with 35 additions and 8 deletions

View file

@ -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.

View file

@ -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)
{

View file

@ -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;

View file

@ -1,3 +1,7 @@
2012-04-09 Roland McGrath <mcgrathr@google.com>
* bfdlink.h (struct bfd_link_info): Add new member user_phdrs.
2012-03-15 Alan Modra <amodra@gmail.com>
* dis-asm.h (disassemble_init_powerpc): Declare.

View file

@ -405,6 +405,9 @@ struct bfd_link_info
/* TRUE if we should warn alternate ELF machine code. */
unsigned int warn_alternate_em: 1;
/* TRUE if the linker script contained an explicit PHDRS command. */
unsigned int user_phdrs: 1;
/* Char that may appear as the first char of a symbol, but should be
skipped (like symbol_leading_char) when looking up symbols in
wrap_hash. Used by PowerPC Linux for 'dot' symbols. */