This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: VMA section overlap warnings for overlays
- From: Alan Modra <amodra at gmail dot com>
- To: "H.J. Lu" <hjl dot tools at gmail dot com>
- Cc: Andreas Schwab <schwab at redhat dot com>, David Stubbs <stubbs at icerasemi dot com>, binutils at sourceware dot org
- Date: Fri, 25 Feb 2011 18:19:17 +1030
- Subject: Re: VMA section overlap warnings for overlays
- References: <20100715141753.GI31087@bubble.grove.modra.org> <AANLkTin6LROD7EYNNjVk6z_lflaoyczHpv6iHzSvGW5s@mail.gmail.com> <m3d3uox15y.fsf@hase.home> <AANLkTimsUfwjV0LTKabsdnIhbR1aSFGcJ3VLV8nApK2d@mail.gmail.com> <m34ofzx4d7.fsf@hase.home> <20100716093630.GN31087@bubble.grove.modra.org> <m3tynv7ict.fsf@hase.home> <20100720054451.GF19525@bubble.grove.modra.org> <20100720141031.GI19525@bubble.grove.modra.org> <AANLkTinZVnBqun1qxJHgWiFfYkHWF=XpxGFz2aX65v8B@mail.gmail.com>
On Thu, Feb 24, 2011 at 03:49:25PM -0800, H.J. Lu wrote:
> On Tue, Jul 20, 2010 at 7:10 AM, Alan Modra <amodra@gmail.com> wrote:
> > This removes all the special treatment for zero size sections when
> > using ELF_SECTION_IN_SEGMENT in elf.c, and makes readelf display
[snip]
> This may have caused:
>
> http://sourceware.org/bugzilla/show_bug.cgi?id=12516
Yes, looks like it.
PR 12519
* internal.h (ELF_SECTION_IN_SEGMENT_1): Don't match zero size
sections at start or end of PT_DYNAMIC.
Index: include/elf/internal.h
===================================================================
RCS file: /cvs/src/src/include/elf/internal.h,v
retrieving revision 1.26
diff -u -p -r1.26 internal.h
--- include/elf/internal.h 20 Jul 2010 14:08:30 -0000 1.26
+++ include/elf/internal.h 25 Feb 2011 04:28:30 -0000
@@ -302,7 +302,9 @@ struct elf_segment_map
/* Decide if the section SEC_HDR is in SEGMENT. If CHECK_VMA, then
VMAs are checked for alloc sections. If STRICT, then a zero size
section won't match at the end of a segment, unless the segment
- is also zero size. */
+ is also zero size. Regardless of STRICT and CHECK_VMA, zero size
+ sections won't match at the start or end of PT_DYNAMIC, unless
+ PT_DYNAMIC is itself zero sized. */
#define ELF_SECTION_IN_SEGMENT_1(sec_hdr, segment, check_vma, strict) \
((/* Only PT_LOAD, PT_GNU_RELRO and PT_TLS segments can contain \
SHF_TLS sections. */ \
@@ -334,7 +336,19 @@ struct elf_segment_map
<= (segment)->p_memsz - 1)) \
&& (((sec_hdr)->sh_addr - (segment)->p_vaddr \
+ ELF_SECTION_SIZE(sec_hdr, segment)) \
- <= (segment)->p_memsz))))
+ <= (segment)->p_memsz))) \
+ /* No zero size sections at start or end of PT_DYNAMIC. */ \
+ && ((segment)->p_type != PT_DYNAMIC \
+ || (sec_hdr)->sh_size != 0 \
+ || (segment)->p_memsz == 0 \
+ || (((sec_hdr)->sh_type == SHT_NOBITS \
+ || ((bfd_vma) (sec_hdr)->sh_offset > (segment)->p_offset \
+ && ((sec_hdr)->sh_offset - (segment)->p_offset \
+ < (segment)->p_filesz))) \
+ && (((sec_hdr)->sh_flags & SHF_ALLOC) == 0 \
+ || ((sec_hdr)->sh_addr > (segment)->p_vaddr \
+ && ((sec_hdr)->sh_addr - (segment)->p_vaddr \
+ < (segment)->p_memsz))))))
#define ELF_SECTION_IN_SEGMENT(sec_hdr, segment) \
(ELF_SECTION_IN_SEGMENT_1 (sec_hdr, segment, 1, 0))
--
Alan Modra
Australia Development Lab, IBM