Как создать 32-битную разделяемую библиотеку на 64-битной платформе с автоинструментами - PullRequest
17 голосов
/ 21 марта 2011

Я использую автоинструменты для сборки своей системы, которая состоит в основном из библиотеки.На 64-битных платформах Red Hat мне нужно создать библиотеку, способную работать на 32-битных платформах Red Hat.

Когда я добавляю -m32 в строки компиляции, все прекрасно работает для создания статической (.a) библиотеки, но как только я пытаюсь создать разделяемую библиотеку, я получаю ошибку, подобную этой:

/usr/bin/ld: warning: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o' is incompatible with i386 output
/usr/bin/ld: warning: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbeginS.o' is incompatible with i386 output  
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbeginS.o: In function `__do_global_dtors_aux':  
crtstuff.c:(.text+0x29): undefined reference to `__DTOR_END__'  
collect2: ld returned 1 exit status' 

Я вижу проблему в том, что она включает 64-битные объектные файлы из / usr / lib64 вместо правильных 32-битных из / usr / lib (они там в порядке),но я не могу понять, как это исправить.

Ответы [ 7 ]

14 голосов
/ 09 августа 2011

Во-первых, убедитесь, что у вас есть поддержка компилятора / libc для 32-битной компиляции. В некоторых дистрибутивах, таких как Ubuntu, вам нужно установить пакеты gcc-multilib и / или g++-multilib:

sudo apt-get install gcc-multilib g++-multilib

Затем при вызове configure укажите 32-битный хост и передайте флаги 32-битной компиляции:

./configure --host=i686-linux-gnu "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32"

Если у вас не установлен multilib, вы получите сообщение об ошибке типа configure: error: C compiler cannot create executables при пропуске флага -m32.

3 голосов
/ 20 ноября 2013

У меня была эта проблема на RHEL6. Это сработало

./configure --host=i386-redhat-linux --build=i386-redhat-linux "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32" "LTCC=gcc -m32"

LTCC=gcc -m32 было магическим заклинанием, необходимым для получения libtool для сборки библиотеки 32 бит

1 голос
/ 05 сентября 2013

У меня была такая же проблема. Но я не пользуюсь автоинструментами. Затем в Makefile, отредактированном вручную, я заметил, что в строке

$(CC) -shared -Wl,-soname,lib$(NAME).so.0 -o lib$(NAME).so.$(VERSION) $(OBJ)

не было опции для gcc, которая указывает на 32-битную архитектуру. Как только у моих CFLAGS уже есть опция -m32, я решил поместить ее в строку, указанную выше:

$(CC) $(CFLAGS) -shared -Wl,-soname,lib$(NAME).so.0 -o lib$(NAME).so.$(VERSION) $(OBJ)

и вуаля. Это работает!

Так что, в autotools, возможно, установка переменной CFLAGS для включения опции -m32 вам тоже подходит.

Надеюсь, я помог ...

0 голосов
/ 03 мая 2017

Быстрое исправление ....

Сборка приложения на другом ПК с 32-битным linux и передача полученного файлы приложений (библиотеки и т. д.) на желаемую 64-битную машину Linux. Посмотри, работает ли это. Это сработало для меня.

0 голосов
/ 23 июля 2012

Флаг компоновщика GNU для создания 32-битного общего объекта на 64-битной машине: -m elf_i386 Поэтому, например, напишите в Makefile:

LDFLAGS=-m elf_i386
0 голосов
/ 19 декабря 2011

У меня была такая же проблема: работая на 64-битной машине Ubuntu, мне удалось скомпилировать и связать 32-битные хосты, используя export CFLAGS=-m32; ./configure --host=i386, но libtool все равно сгенерировал бы 64-битную разделяемую библиотеку.

Я работал над этим, создав 32-битную среду сборки и привязав к ней. Ubuntu делает это легко с помощью debootstrap .

0 голосов
/ 18 августа 2011

Вы бы попробовали:

CFLAGS=-m32 -Wl,-m32
CXXFLAGS=-m32 -Wl,-m32
LDFLAGS=-m32

в вашем make-файле, так как некоторые скрипты пытаются связать, используя gcc или g ++ вместо ld, как мы ожидаем?

Обновление: если вы вручную изменяете каждый вызов gcc / g ++, попробуйте использовать -m32 -Wl, -m32 вместо простого -m32 в качестве дополнительной опции.

...