From 2eea244095a1f8c2a19ca349984f902307f7fa11 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Wed, 21 Aug 2013 08:15:23 +0000 Subject: 2013-08-21 Tristan Gingold * coff-rs6000.c (_bfd_xcoff_sizeof_headers): Also count .ovrflo sections. * coffcode.h (coff_compute_section_file_positions): Force match between file offset and vma offset. --- bfd/coffcode.h | 54 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) (limited to 'bfd/coffcode.h') diff --git a/bfd/coffcode.h b/bfd/coffcode.h index a198e1c..542b5b7 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -3363,36 +3363,38 @@ coff_compute_section_file_positions (bfd * abfd) padding the previous section up if necessary. */ old_sofar = sofar; + sofar = BFD_ALIGN (sofar, 1 << current->alignment_power); + #ifdef RS6000COFF_C - /* AIX loader checks the text section alignment of (vma - filepos) - So even though the filepos may be aligned wrt the o_algntext, for - AIX executables, this check fails. This shows up when a native - AIX executable is stripped with gnu strip because the default vma - of native is 0x10000150 but default for gnu is 0x10000140. Gnu - stripped gnu excutable passes this check because the filepos is - 0x0140. This problem also show up with 64 bit shared objects. The - data section must also be aligned. */ + /* Make sure the file offset and the vma of .text/.data are at the + same page offset, so that the file can be mmap'ed without being + relocated. Failing that, AIX is able to load and execute the + program, but it will be silently relocated (possible as + executables are PIE). But the relocation is slightly costly and + complexify the use of addr2line or gdb. So better to avoid it, + like does the native linker. Usually gnu ld makes sure that + the vma of .text is the file offset so this issue shouldn't + appear unless you are stripping such an executable. + + AIX loader checks the text section alignment of (vma - filepos), + and the native linker doesn't try to align the text sections. + For example: + + 0 .text 000054cc 10000128 10000128 00000128 2**5 + CONTENTS, ALLOC, LOAD, CODE + */ + if (!strcmp (current->name, _TEXT) || !strcmp (current->name, _DATA)) { - bfd_vma pad; - bfd_vma align; - - sofar = BFD_ALIGN (sofar, 1 << current->alignment_power); - - align = 1 << current->alignment_power; - pad = abs (current->vma - sofar) % align; - - if (pad) - { - pad = align - pad; - sofar += pad; - } - } - else -#else - { - sofar = BFD_ALIGN (sofar, 1 << current->alignment_power); + bfd_vma align = 4096; + bfd_vma sofar_off = sofar % align; + bfd_vma vma_off = current->vma % align; + + if (vma_off > sofar_off) + sofar += vma_off - sofar_off; + else if (vma_off < sofar_off) + sofar += align + vma_off - sofar_off; } #endif if (previous != NULL) -- cgit v1.1