From 47ede03a416b9633130623411cc35688461febdd Mon Sep 17 00:00:00 2001 From: Tom Rix Date: Thu, 20 Dec 2001 21:29:21 +0000 Subject: [PATCH] Special handling of AIX xcoff text alignment fix. --- bfd/ChangeLog | 5 +++++ bfd/coffcode.h | 31 ++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 223f350b86..a81b0b3114 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2001-12-20 Tom Rix + + * coffcode.h (coff_compute_section_file_positions): Add special AIX + loader alignment of text section. + 2001-12-20 Jason Thorpe * config.bfd (mips-dec-netbsd*): Delete alias for mips*el-*-netbsd*. diff --git a/bfd/coffcode.h b/bfd/coffcode.h index d759115be0..b5bd4429c7 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -3054,7 +3054,36 @@ coff_compute_section_file_positions (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 an 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. */ + if (!strcmp (current->name, _TEXT)) + { + 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); + } +#endif if (previous != (asection *) NULL) { previous->_raw_size += sofar - old_sofar; -- 2.34.1