diff options
author | Alan Modra <amodra@gmail.com> | 2007-05-02 13:44:37 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2007-05-02 13:44:37 +0000 |
commit | 627b32bcf9eadc335b8c07f7cf8ea7155ef15fbd (patch) | |
tree | d5699c6c907692bc6530872e60fc2e3564792f80 /include/elf | |
parent | 2afd3f0adc4f70d8d5bd4bc57a6eb53542edf66f (diff) | |
download | gdb-627b32bcf9eadc335b8c07f7cf8ea7155ef15fbd.zip gdb-627b32bcf9eadc335b8c07f7cf8ea7155ef15fbd.tar.gz gdb-627b32bcf9eadc335b8c07f7cf8ea7155ef15fbd.tar.bz2 |
include/elf/
* internal.h (ELF_IS_SECTION_IN_SEGMENT): Check both file offset
and vma for appropriate sections.
bfd/
* elf.c (assign_file_positions_for_load_sections): Set sh_offset
here. Set sh_type to SHT_NOBITS if we won't be allocating
file space. Don't bump p_memsz for non-alloc sections. Adjust
section-in-segment check.
(assign_file_positions_for_non_load_sections): Don't set sh_offset
here for sections that have already been handled above.
Diffstat (limited to 'include/elf')
-rw-r--r-- | include/elf/ChangeLog | 5 | ||||
-rw-r--r-- | include/elf/internal.h | 36 |
2 files changed, 23 insertions, 18 deletions
diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog index 89deb48..c214009 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -1,3 +1,8 @@ +2007-05-02 Alan Modra <amodra@bigpond.net.au> + + * internal.h (ELF_IS_SECTION_IN_SEGMENT): Check both file offset + and vma for appropriate sections. + 2007-04-26 Jan Beulich <jbeulich@novell.com> * common.h (DT_ENCODING): Correct value (back to spec mandated diff --git a/include/elf/internal.h b/include/elf/internal.h index f2161ff..1521711 100644 --- a/include/elf/internal.h +++ b/include/elf/internal.h @@ -1,6 +1,6 @@ /* ELF support for BFD. Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002, - 2003, 2006 Free Software Foundation, Inc. + 2003, 2006, 2007 Free Software Foundation, Inc. Written by Fred Fish @ Cygnus Support, from information published in "UNIX System V Release 4, Programmers Guide: ANSI C and @@ -268,23 +268,23 @@ struct elf_segment_map /* Decide if the given sec_hdr is in the given segment. PT_TLS segment contains only SHF_TLS sections. Only PT_LOAD and PT_TLS segments can contain SHF_TLS sections. */ -#define ELF_IS_SECTION_IN_SEGMENT(sec_hdr, segment) \ - (((((sec_hdr->sh_flags & SHF_TLS) != 0) \ - && (segment->p_type == PT_TLS \ - || segment->p_type == PT_LOAD)) \ - || ((sec_hdr->sh_flags & SHF_TLS) == 0 \ - && segment->p_type != PT_TLS)) \ - /* Compare allocated sec_hdrs by VMA, unallocated sec_hdrs \ - by file offset. */ \ - && (sec_hdr->sh_flags & SHF_ALLOC \ - ? (sec_hdr->sh_addr >= segment->p_vaddr \ - && (sec_hdr->sh_addr \ - + ELF_SECTION_SIZE(sec_hdr, segment) \ - <= segment->p_vaddr + segment->p_memsz)) \ - : ((bfd_vma) sec_hdr->sh_offset >= segment->p_offset \ - && (sec_hdr->sh_offset \ - + ELF_SECTION_SIZE(sec_hdr, segment) \ - <= segment->p_offset + segment->p_filesz)))) +#define ELF_IS_SECTION_IN_SEGMENT(sec_hdr, segment) \ + (((((sec_hdr->sh_flags & SHF_TLS) != 0) \ + && (segment->p_type == PT_TLS \ + || segment->p_type == PT_LOAD)) \ + || ((sec_hdr->sh_flags & SHF_TLS) == 0 \ + && segment->p_type != PT_TLS)) \ + /* Any section besides one of type SHT_NOBITS must have a file \ + offset within the segment. */ \ + && (sec_hdr->sh_type == SHT_NOBITS \ + || ((bfd_vma) sec_hdr->sh_offset >= segment->p_offset \ + && (sec_hdr->sh_offset + ELF_SECTION_SIZE(sec_hdr, segment) \ + <= segment->p_offset + segment->p_filesz))) \ + /* SHF_ALLOC sections must have VMAs within the segment. */ \ + && ((sec_hdr->sh_flags & SHF_ALLOC) == 0 \ + || (sec_hdr->sh_addr >= segment->p_vaddr \ + && (sec_hdr->sh_addr + ELF_SECTION_SIZE(sec_hdr, segment) \ + <= segment->p_vaddr + segment->p_memsz)))) /* Decide if the given sec_hdr is in the given segment in file. */ #define ELF_IS_SECTION_IN_SEGMENT_FILE(sec_hdr, segment) \ |