diff options
author | Tom Rix <trix@redhat.com> | 2001-12-20 21:29:21 +0000 |
---|---|---|
committer | Tom Rix <trix@redhat.com> | 2001-12-20 21:29:21 +0000 |
commit | 47ede03a416b9633130623411cc35688461febdd (patch) | |
tree | 31b29ba0f319d28fb85bc6dc8dc0ee44db0a7696 /bfd | |
parent | c3d3ce5b899ed50f90638541669be99930216730 (diff) | |
download | gdb-47ede03a416b9633130623411cc35688461febdd.zip gdb-47ede03a416b9633130623411cc35688461febdd.tar.gz gdb-47ede03a416b9633130623411cc35688461febdd.tar.bz2 |
Special handling of AIX xcoff text alignment fix.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/coffcode.h | 31 |
2 files changed, 35 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 223f350..a81b0b3 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2001-12-20 Tom Rix <trix@redhat.com> + + * coffcode.h (coff_compute_section_file_positions): Add special AIX + loader alignment of text section. + 2001-12-20 Jason Thorpe <thorpej@wasabisystems.com> * config.bfd (mips-dec-netbsd*): Delete alias for mips*el-*-netbsd*. diff --git a/bfd/coffcode.h b/bfd/coffcode.h index d759115..b5bd442 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; |