From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7852 invoked by alias); 24 Apr 2010 02:18:07 -0000 Received: (qmail 7806 invoked by uid 22791); 24 Apr 2010 02:18:03 -0000 X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE X-Spam-Check-By: sourceware.org Received: from mail-yw0-f188.google.com (HELO mail-yw0-f188.google.com) (209.85.211.188) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 24 Apr 2010 02:17:58 +0000 Received: by ywh26 with SMTP id 26so297093ywh.12 for ; Fri, 23 Apr 2010 19:17:56 -0700 (PDT) Received: by 10.151.129.5 with SMTP id g5mr842929ybn.260.1272075476129; Fri, 23 Apr 2010 19:17:56 -0700 (PDT) Received: from bubble.grove.modra.org ([115.187.252.19]) by mx.google.com with ESMTPS id 23sm1157247iwn.2.2010.04.23.19.17.54 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 23 Apr 2010 19:17:55 -0700 (PDT) Received: by bubble.grove.modra.org (Postfix, from userid 1000) id 1A9A8170C2B5; Sat, 24 Apr 2010 11:47:50 +0930 (CST) Date: Sat, 24 Apr 2010 02:18:00 -0000 From: Alan Modra To: David Stubbs Cc: binutils@sourceware.org Subject: Re: VMA section overlap warnings for overlays Message-ID: <20100424021750.GQ3510@bubble.grove.modra.org> Mail-Followup-To: David Stubbs , binutils@sourceware.org References: <4D60B0700D1DB54A8C0C6E9BE69163700E67DFD1@EXCHANGEVS.IceraSemi.local> <20100421082441.GG3510@bubble.grove.modra.org> <4D60B0700D1DB54A8C0C6E9BE69163700E7815C7@EXCHANGEVS.IceraSemi.local> <20100422011106.GI3510@bubble.grove.modra.org> <20100422015303.GK3510@bubble.grove.modra.org> <4D60B0700D1DB54A8C0C6E9BE69163700E7F2F15@EXCHANGEVS.IceraSemi.local> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D60B0700D1DB54A8C0C6E9BE69163700E7F2F15@EXCHANGEVS.IceraSemi.local> User-Agent: Mutt/1.5.20 (2009-06-14) X-IsSubscribed: yes Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org X-SW-Source: 2010-04/txt/msg00391.txt.bz2 This patch silences the "section can't be allocated in segment" warning in cases where people pack overlays into one segment. I also took the opportunity to tidy associated SECTION_IN_SEGMENT macros. include/elf/ * internal.h (ELF_SECTION_SIZE): Protect macro args with parentheses. Invert logic to clarify test for .tbss. (ELF_IS_SECTION_IN_SEGMENT): Rename to.. (ELF_SECTION_IN_SEGMENT_1): ..this. Add check_vma param. Protect macro args with parentheses. (ELF_SECTION_IN_SEGMENT): Define. (ELF_IS_SECTION_IN_SEGMENT_FILE): Delete. (ELF_IS_SECTION_IN_SEGMENT_MEMORY): Delete. bfd/ * elf.c: Replace use of ELF_IS_SECTION_IN_SEGMENT and ELF_IS_SECTION_IN_SEGMENT_FILE with ELF_SECTION_IN_SEGMENT throughout file. (assign_file_positions_for_load_sections): Modify section in segment warning to ignore overlay vmas. * elf32-spu.c (spu_elf_object_p): Replace use of ELF_IS_SECTION_IN_SEGMENT_MEMORY with ELF_SECTION_IN_SEGMENT. binutils/ * readelf.c (process_program_headers): Replace use of ELF_IS_SECTION_IN_SEGMENT_MEMORY with ELF_SECTION_IN_SEGMENT. Index: include/elf/internal.h =================================================================== RCS file: /cvs/src/src/include/elf/internal.h,v retrieving revision 1.24 diff -u -p -r1.24 internal.h --- include/elf/internal.h 15 Apr 2010 10:26:08 -0000 1.24 +++ include/elf/internal.h 24 Apr 2010 01:03:03 -0000 @@ -292,42 +292,36 @@ struct elf_segment_map /* .tbss is special. It doesn't contribute memory space to normal segments and it doesn't take file space in normal segments. */ #define ELF_SECTION_SIZE(sec_hdr, segment) \ - (((sec_hdr->sh_flags & SHF_TLS) == 0 \ - || sec_hdr->sh_type != SHT_NOBITS \ - || segment->p_type == PT_TLS) ? sec_hdr->sh_size : 0) + ((!(((sec_hdr)->sh_flags & SHF_TLS) != 0 \ + && (sec_hdr)->sh_type == SHT_NOBITS) \ + || (segment)->p_type == PT_TLS) ? (sec_hdr)->sh_size : 0) /* Decide if the given sec_hdr is in the given segment. PT_TLS segment contains only SHF_TLS sections. Only PT_LOAD, PT_GNU_RELRO and 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_GNU_RELRO \ - || segment->p_type == PT_LOAD)) \ - || ((sec_hdr->sh_flags & SHF_TLS) == 0 \ - && segment->p_type != PT_TLS \ - && segment->p_type != PT_PHDR)) \ +#define ELF_SECTION_IN_SEGMENT_1(sec_hdr, segment, check_vma) \ + ((((((sec_hdr)->sh_flags & SHF_TLS) != 0) \ + && ((segment)->p_type == PT_TLS \ + || (segment)->p_type == PT_GNU_RELRO \ + || (segment)->p_type == PT_LOAD)) \ + || (((sec_hdr)->sh_flags & SHF_TLS) == 0 \ + && (segment)->p_type != PT_TLS \ + && (segment)->p_type != PT_PHDR)) \ /* 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))) \ + && ((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. Be \ careful about segments right at the end of memory. */ \ - && ((sec_hdr->sh_flags & SHF_ALLOC) == 0 \ - || (sec_hdr->sh_addr >= segment->p_vaddr \ - && (sec_hdr->sh_addr - segment->p_vaddr \ - + ELF_SECTION_SIZE(sec_hdr, segment) <= segment->p_memsz)))) + && (!(check_vma) \ + || ((sec_hdr)->sh_flags & SHF_ALLOC) == 0 \ + || ((sec_hdr)->sh_addr >= (segment)->p_vaddr \ + && ((sec_hdr)->sh_addr - (segment)->p_vaddr \ + + ELF_SECTION_SIZE(sec_hdr, segment) <= (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) \ - (sec_hdr->sh_size > 0 \ - && ELF_IS_SECTION_IN_SEGMENT (sec_hdr, segment)) - -/* Decide if the given sec_hdr is in the given segment in memory. */ -#define ELF_IS_SECTION_IN_SEGMENT_MEMORY(sec_hdr, segment) \ - (ELF_SECTION_SIZE(sec_hdr, segment) > 0 \ - && ELF_IS_SECTION_IN_SEGMENT (sec_hdr, segment)) +#define ELF_SECTION_IN_SEGMENT(sec_hdr, segment) \ + (ELF_SECTION_IN_SEGMENT_1 (sec_hdr, segment, 1)) #endif /* _ELF_INTERNAL_H */ Index: bfd/elf.c =================================================================== RCS file: /cvs/src/src/bfd/elf.c,v retrieving revision 1.509 diff -u -p -r1.509 elf.c --- bfd/elf.c 22 Apr 2010 01:51:00 -0000 1.509 +++ bfd/elf.c 24 Apr 2010 01:03:06 -0000 @@ -978,7 +978,7 @@ _bfd_elf_make_section_from_shdr (bfd *ab for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++) { if (phdr->p_type == PT_LOAD - && ELF_IS_SECTION_IN_SEGMENT (hdr, phdr)) + && ELF_SECTION_IN_SEGMENT (hdr, phdr)) { if ((flags & SEC_LOAD) == 0) newsect->lma = (phdr->p_paddr @@ -4552,22 +4552,38 @@ assign_file_positions_for_load_sections /* Check that all sections are in a PT_LOAD segment. Don't check funky gdb generated core files. */ if (p->p_type == PT_LOAD && bfd_get_format (abfd) != bfd_core) - for (i = 0, secpp = m->sections; i < m->count; i++, secpp++) - { - Elf_Internal_Shdr *this_hdr; - asection *sec; + { + bfd_boolean check_vma = TRUE; - sec = *secpp; - this_hdr = &(elf_section_data(sec)->this_hdr); - if (this_hdr->sh_size != 0 - && !ELF_IS_SECTION_IN_SEGMENT_FILE (this_hdr, p)) + for (i = 1; i < m->count; i++) + if (m->sections[i]->vma == m->sections[i - 1]->vma + && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i]) + ->this_hdr), p) != 0 + && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i - 1]) + ->this_hdr), p) != 0) { - (*_bfd_error_handler) - (_("%B: section `%A' can't be allocated in segment %d"), - abfd, sec, j); - print_segment_map (m); + /* Looks like we have overlays packed into the segment. */ + check_vma = FALSE; + break; } - } + + for (i = 0; i < m->count; i++) + { + Elf_Internal_Shdr *this_hdr; + asection *sec; + + sec = m->sections[i]; + this_hdr = &(elf_section_data(sec)->this_hdr); + if (this_hdr->sh_size != 0 + && !ELF_SECTION_IN_SEGMENT_1 (this_hdr, p, check_vma)) + { + (*_bfd_error_handler) + (_("%B: section `%A' can't be allocated in segment %d"), + abfd, sec, j); + print_segment_map (m); + } + } + } } elf_tdata (abfd)->next_file_pos = off; @@ -5837,7 +5853,8 @@ copy_elf_program_header (bfd *ibfd, bfd section = section->next) { this_hdr = &(elf_section_data(section)->this_hdr); - if (ELF_IS_SECTION_IN_SEGMENT_FILE (this_hdr, segment)) + if (this_hdr->sh_size != 0 + && ELF_SECTION_IN_SEGMENT (this_hdr, segment)) { if (!first_section) first_section = lowest_section = section; @@ -5916,7 +5933,8 @@ copy_elf_program_header (bfd *ibfd, bfd section = section->next) { this_hdr = &(elf_section_data(section)->this_hdr); - if (ELF_IS_SECTION_IN_SEGMENT_FILE (this_hdr, segment)) + if (this_hdr->sh_size != 0 + && ELF_SECTION_IN_SEGMENT (this_hdr, segment)) { map->sections[isec++] = section->output_section; if (isec == section_count) @@ -5993,7 +6011,8 @@ copy_private_bfd_data (bfd *ibfd, bfd *o /* Check if this section is covered by the segment. */ this_hdr = &(elf_section_data(section)->this_hdr); - if (ELF_IS_SECTION_IN_SEGMENT_FILE (this_hdr, segment)) + if (this_hdr->sh_size != 0 + && ELF_SECTION_IN_SEGMENT (this_hdr, segment)) { /* FIXME: Check if its output section is changed or removed. What else do we need to check? */ Index: bfd/elf32-spu.c =================================================================== RCS file: /cvs/src/src/bfd/elf32-spu.c,v retrieving revision 1.94 diff -u -p -r1.94 elf32-spu.c --- bfd/elf32-spu.c 4 Feb 2010 09:16:40 -0000 1.94 +++ bfd/elf32-spu.c 24 Apr 2010 01:03:08 -0000 @@ -272,7 +272,8 @@ spu_elf_object_p (bfd *abfd) { Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[j]; - if (ELF_IS_SECTION_IN_SEGMENT_MEMORY (shdr, phdr)) + if (ELF_SECTION_SIZE (shdr, phdr) != 0 + && ELF_SECTION_IN_SEGMENT (shdr, phdr)) { asection *sec = shdr->bfd_section; spu_elf_section_data (sec)->u.o.ovl_index = num_ovl; Index: binutils/readelf.c =================================================================== RCS file: /cvs/src/src/binutils/readelf.c,v retrieving revision 1.494 diff -u -p -r1.494 readelf.c --- binutils/readelf.c 20 Apr 2010 08:21:54 -0000 1.494 +++ binutils/readelf.c 24 Apr 2010 01:03:12 -0000 @@ -3850,7 +3850,8 @@ process_program_headers (FILE * file) for (j = 1; j < elf_header.e_shnum; j++, section++) { - if (ELF_IS_SECTION_IN_SEGMENT_MEMORY (section, segment)) + if (ELF_SECTION_SIZE (section, segment) != 0 + && ELF_SECTION_IN_SEGMENT (section, segment)) printf ("%s ", SECTION_NAME (section)); } -- Alan Modra Australia Development Lab, IBM