This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: PATCH: PR ld/4701: binutils generates invalid klibc-based binary on Linux x86_64
- From: "H. J. Lu" <hjl at lucon dot org>
- To: binutils at sources dot redhat dot com
- Cc: amodra at bigpond dot net dot au
- Date: Wed, 27 Jun 2007 11:44:10 -0700
- Subject: Re: PATCH: PR ld/4701: binutils generates invalid klibc-based binary on Linux x86_64
- References: <20070627180903.GA10335@lucon.org>
On Wed, Jun 27, 2007 at 11:09:03AM -0700, H. J. Lu wrote:
> I don't think we can skip segment alignment on disk when its offset
> < alignment. This patch fixes it. I will try to find a small testcase.
>
>
Here is the updated patch with a small testcase.
H.J.
----
bfd/
2007-06-27 H.J. Lu <hongjiu.lu@intel.com>
PR ld/4701
* elf.c (assign_file_positions_for_load_sections): Skip segment
alignment on disk only if its offset >= alignment.
ld/testsuite/
2007-06-27 H.J. Lu <hongjiu.lu@intel.com>
PR ld/4701
* ld-elf/noload-2.d: New.
--- binutils/bfd/elf.c.bss 2007-06-26 10:15:25.000000000 -0700
+++ binutils/bfd/elf.c 2007-06-27 11:39:32.000000000 -0700
@@ -4518,21 +4518,24 @@ assign_file_positions_for_load_sections
adjust = vma_page_aligned_bias (m->sections[0]->vma, off, align);
if (adjust != 0)
{
- /* If the first section isn't loadable, the same holds
- for any other sections. We don't need to align the
- segment on disk since the segment doesn't need file
- space. */
- i = 0;
- while (elf_section_type (m->sections[i]) == SHT_NOBITS)
+ if ((ufile_ptr) off >= align)
{
- /* If a segment starts with .tbss, we need to look
- at the next section to decide whether the segment
- has any loadable sections. */
- if ((elf_section_flags (m->sections[i]) & SHF_TLS) == 0
- || ++i >= m->count)
+ /* If the first section isn't loadable, the same holds
+ for any other sections. We don't need to align the
+ segment on disk since the segment doesn't need file
+ space. */
+ i = 0;
+ while (elf_section_type (m->sections[i]) == SHT_NOBITS)
{
- adjust = 0;
- break;
+ /* If a segment starts with .tbss, we need to look
+ at the next section to decide whether the segment
+ has any loadable sections. */
+ if (!(elf_section_flags (m->sections[i]) & SHF_TLS)
+ || ++i >= m->count)
+ {
+ adjust = 0;
+ break;
+ }
}
}
off += adjust;
--- binutils/ld/testsuite/ld-elf/noload-2.d.bss 2007-06-27 11:27:55.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/noload-2.d 2007-06-27 11:38:42.000000000 -0700
@@ -0,0 +1,8 @@
+#source: noload-1.s
+#ld: -T noload-1.t -z max-page-size=0x200000
+#readelf: -Sl --wide
+#target: *-*-linux*
+
+#...
+ +LOAD +0x200000 +0x0+ +0x0+ +0x0+ +0x0+1 +RW +0x200000
+#pass