This is the mail archive of the binutils@sourceware.org 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]

Fix seg-fault when attempting to link x86_64 binaries as if they were i386 binaries


Hi Guys,

  Try the following on an x86_64 system:

    % echo "int main (void) { return 0; }" > main.c
    % gcc -c main.c
    % gcc -m32 -march=i686 main.o
    collect2: ld terminated with signal 11 [Segmentation fault], core dumped
    /usr/bin/ld: i386:x86-64 architecture of input file `main.o' is incompatible with i386 output

  The warning message makes it clear what the user did wrong, but
  nevertheless the linker should not have seg-faulted.

  The patch below prevents the seg-fault and causes the linker to
  return a suitable error message, although it does not fix the
  underlying problem.  (Somewhere a dynamic section is being created
  but no contents are being allocated to it).  I will try to find time
  to track that problem down later on, but for now I am going to check
  in the patch so that we get:

    /usr/bin/ld: i386:x86-64 architecture of input file `t.o' is incompatible with i386 output
    /usr/bin/ld: final link failed: Invalid operation

Cheers
  Nick

bfd/ChangeLog
2009-03-27  Nick Clifton  <nickc@redhat.com>

	* section.c (bfd_get_section_contents): Detect and handle the case
	where a section has the SEC_IN_MEMORY flag set but no actual
	contents allocated.

Index: bfd/section.c
===================================================================
RCS file: /cvs/src/src/bfd/section.c,v
retrieving revision 1.101
diff -c -3 -p -r1.101 section.c
*** bfd/section.c	19 Mar 2009 11:02:09 -0000	1.101
--- bfd/section.c	27 Mar 2009 11:29:58 -0000
*************** bfd_get_section_contents (bfd *abfd,
*** 1436,1441 ****
--- 1436,1451 ----
  
    if ((section->flags & SEC_IN_MEMORY) != 0)
      {
+       if (section->contents == NULL)
+ 	{
+ 	  /* This can happen because of errors earlier on in the linking process.
+ 	     We do not want to seg-fault here, so clear the flag and return an
+ 	     error code.  */
+ 	  section->flags &= ~ SEC_IN_MEMORY;
+ 	  bfd_set_error (bfd_error_invalid_operation);
+ 	  return FALSE;
+ 	}
+       
        memcpy (location, section->contents + offset, (size_t) count);
        return TRUE;
      }


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