Ошибка компоновщика RHEL

Я на RHEL 5.8 на x86_64 машине:

$ uname -r
2.6.18-308.1.1.el5
$ uname -m
x86_64
$

попробуйте кросс-компилировать исходники, чтобы они были i386 совместимыми:

CFLAGS += -m32
LDFLAGS += -L/lib -lpthread -luuid

но этап ссылки завершается с ошибкой:

/usr/bin/ld: skipping incompatible /usr/lib64/libuuid.so when searching for -luuid
/usr/bin/ld: skipping incompatible /usr/lib64/libuuid.a when searching for -luuid
/usr/bin/ld: cannot find -luuid
collect2: ld returned 1 exit status

На самом деле, хост-машина имеет /lib/libuuid.so.1.2:

$ readelf -h /lib/libuuid.so.1.2
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           Intel 80386
  Version:                           0x1
  Entry point address:               0xf90
  Start of program headers:          52 (bytes into file)
  Start of section headers:          13352 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         6
  Size of section headers:           40 (bytes)
  Number of section headers:         28
  Section header string table index: 27
$

Существуют ли какие-либо ld или другие варианты решения этой проблемы со ссылками?


person Community    schedule 12.04.2012    source источник
comment
У вас также есть символическая ссылка libuuid.so -> libuuid.so.1.2 в /lib?   -  person rwos    schedule 12.04.2012
comment
Я создал ссылку, и двоичный файл скомпилирован нормально! Не могли бы вы опубликовать ответ? Я приму это.   -  person    schedule 12.04.2012


Ответы (2)


Компоновщик ищет только имя библиотеки без номеров версий ("libuuid.so"). Соглашение состоит в том, чтобы сделать символическую ссылку на soname (в данном случае это будет «libuuid.so.1»), которая, в свою очередь, является символической ссылкой на реальную разделяемую библиотеку (в данном случае «libuuid.so.1.2»).

Итак, вам понадобятся эти символические ссылки в /lib, чтобы компоновщик мог найти библиотеку.

(подробнее по этой теме: http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html)

person rwos    schedule 12.04.2012

Если вы хотите создать ссылку на определенный общий объект, вы должны передать его непосредственно компилятору или компоновщику.

person Ignacio Vazquez-Abrams    schedule 12.04.2012