PATCH: Check ELF class for DT_NEEDED (Re: Problem with biarch support: Wrong library linked in...)
H . J . Lu
hjl@lucon.org
Tue Jun 11 18:12:00 GMT 2002
On Tue, Jun 11, 2002 at 09:46:28AM +0200, Andreas Jaeger wrote:
>
> On x86-64 we have both 32-bit libs in lib and 64-bit libs in lib64.
> But this gives a problem with the search done in emultempl/elf32.em.
> ld suddenly decides to use a 32-bit library:
>
> $ gcc -Wall -o xw -L/usr/X11R6/lib64 -lX11 -lXext -lXmu -lm xw.o xaccess.o fashion.o -lXinerama
> /usr/X11R6/lib/libSM.so.6: could not read symbols: Invalid operation
> collect2: ld returned 1 exit status
> make: *** [xw] Error 1
>
Here is a patch.
H.J.
-------------- next part --------------
2002-06-11 H.J. Lu <hjl@gnu.org>
* emultempl/elf32.em: Include "elf-bfd.h" instead of
"elf/common.h".
(gld${EMULATION_NAME}_try_needed): Return false if ELF class
doesn't match.
--- ld/emultempl/elf32.em.class Wed Jun 5 09:11:53 2002
+++ ld/emultempl/elf32.em Tue Jun 11 18:09:51 2002
@@ -50,7 +50,7 @@ Foundation, Inc., 59 Temple Place - Suit
#include "ldfile.h"
#include "ldemul.h"
#include "ldgram.h"
-#include "elf/common.h"
+#include "elf-bfd.h"
static void gld${EMULATION_NAME}_before_parse
PARAMS ((void));
@@ -266,6 +266,7 @@ gld${EMULATION_NAME}_try_needed (name, f
{
bfd *abfd;
const char *soname;
+ struct elf_backend_data *inbed, *outbed;
abfd = bfd_openr (name, bfd_get_target (output_bfd));
if (abfd == NULL)
@@ -279,6 +280,14 @@ gld${EMULATION_NAME}_try_needed (name, f
{
bfd_close (abfd);
return false;
+ }
+
+ inbed = get_elf_backend_data (abfd);
+ outbed = get_elf_backend_data (output_bfd);
+ if (inbed->s->elfclass != outbed->s->elfclass)
+ {
+ bfd_close (abfd);
+ return false;
}
/* Check whether this object would include any conflicting library
More information about the Binutils
mailing list