This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]