From 30fe183248b2523ecff9da36853e2f893c4c4b91 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 23 Oct 2019 17:40:51 +1030 Subject: PR4499, assign file positions assumes segment offsets increasing This rewrites much of assign_file_positions_for_non_load_sections to allow objcopy and strip to handle cases like that in PR4499 where program headers were not in their usual position immediately after the ELF file header, and PT_LOAD headers were not sorted by paddr. PR 4499 include/ * elf/internal.h (struct elf_segment_map): Delete header_size. Add no_sort_lma and idx. bfd/ * elf-nacl.c (nacl_modify_segment_map): Set no_sort_lma for all PT_LOAD segments. * elf32-spu.c (spu_elf_modify_segment_map): Likewise on overlay PT_LOAD segments. * elf.c (elf_sort_segments): New function. (assign_file_positions_except_relocs): Use shortcuts to elfheader and elf_tdata. Seek to e_phoff not sizeof_ehdr to write program headers. Move PT_PHDR check.. (assign_file_positions_for_non_load_sections): ..and code setting PT_PHDR p_vaddr and p_paddr, and code setting __ehdr_start value.. (assign_file_positions_for_load_sections): ..to here. Sort PT_LOAD headers. Delete header_pad code. Use actual number of headers rather than allocated in calculating size for program headers. Don't assume program headers follow ELF file header. Simplify pt_load_count code. Only set "off" for PT_LOAD or PT_NOTE in cores. (rewrite_elf_program_header): Set p_vaddr_offset for segments that include file and program headers. (copy_elf_program_header): Likewise, replacing header_size code. --- bfd/elf-nacl.c | 1 + 1 file changed, 1 insertion(+) (limited to 'bfd/elf-nacl.c') diff --git a/bfd/elf-nacl.c b/bfd/elf-nacl.c index 58eebf6..ddac3b3 100644 --- a/bfd/elf-nacl.c +++ b/bfd/elf-nacl.c @@ -197,6 +197,7 @@ nacl_modify_segment_map (bfd *abfd, struct bfd_link_info *info) included the file header and phdrs. */ seg->includes_filehdr = 0; seg->includes_phdrs = 0; + seg->no_sort_lma = 1; /* Also strip out empty segments. */ if (seg->count == 0) { -- cgit v1.1