This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Oddity in the linker code on AIX
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: binutils at sources dot redhat dot com
- Date: Tue, 19 Apr 2005 23:25:32 +0200
- Subject: Oddity in the linker code on AIX
Hi,
We're toying a bit with Binutils on AIX and I stumbled on the following
construct in coff_compute_section_file_positions:
#ifdef ALIGN_SECTIONS_IN_FILE
if ((abfd->flags & EXEC_P) != 0)
{
/* Make sure this section is aligned on the right boundary - by
padding the previous section up if necessary. */
old_sofar = sofar;
#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. */
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);
}
#endif
if (previous != (asection *) NULL)
previous->size += sofar - old_sofar;
}
#endif
Note the mix between preprocessor conditional and C conditional constructs.
As a result, the code eventually compiled on AIX is:
if ((abfd->flags & EXEC_P) != 0)
{
/* Make sure this section is aligned on the right boundary - by
padding the previous section up if necessary. */
old_sofar = sofar;
/* 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. */
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
if (previous != (asection *) NULL)
previous->size += sofar - old_sofar;
}
which looks a little suspicious to me.
Am I right in thinking that the author got a bit confused here?
Thanks in advance.
--
Eric Botcazou