2010-10-29 2 views
10

На 64-битном хосте Я пытаюсь создать общие библиотеки с опцией -m32. Возможно ли, чтобы эти библиотеки были связаны с обычными 64-битными библиотеками?GCC -m32 flag:/usr/bin/ld: пропуск несовместим

Я делаю что-то вроде этого:

g++ -m32 -shared source.cpp -l 64_bit_library.so -o 32_bit_library.so 

и получать сообщения об ошибках, как это:

/usr/bin/ld: skipping incompatible 64_bit_library.so 

Так что мой вопрос: как 64_bit_library.so и 32_bit_library.so должен быть составлен на 64-битном хосте, к сделать так, чтобы 32_bit_library.so был связан с 64_bit_library.so?

ответ

11

Невозможно связать 32-разрядные приложения с 64-битными библиотеками и наоборот. Проблема в том, что указатели и типы вообще не могут быть переданы между ними. Обычно обходным путем является создание дочернего процесса другого размера и использование IPC для связи с этим процессом.

Подумайте об этом так: Если у меня есть C тривиальную функцию:

extern void foo(void*); 

Если это в библиотеке 64-битной и я пытаюсь вызвать его из библиотеки 32-битном, где же другая половина указателя приходят из?

И наоборот, если он находится в 32-битной библиотеке, и я вызываю его из 64-битного приложения, что происходит с другой половиной указателя, который я бы проиграл, чтобы называть его?

+0

Если бы вы были очень осторожны, вы могли бы сыграть в некоторые игры с typedef, mmap с флагом MAP_32BIT и сегментами разделяемой памяти, но это ужасно много хлопот! – Flexo

+0

Можете ли вы сказать, как проверить, что это несовместимо? возможно, с помощью readelf? - http://rzr.online.fr/q/gcc – RzR

+0

@rzr - Самый простой способ проверить - просто использовать команду 'file' на общему объекте и посмотреть, соответствует ли оно тому, что вы пытаетесь делать с gcc. Например, вы можете работать с 'readelf -h' или' objdump -x', но я считаю, что вывод 'file' будет более кратким. – Flexo

Смежные вопросы