GCC -m32 флаг: / usr / bin / ld: пропуск несовместим - PullRequest
10 голосов
/ 29 октября 2010

На 64-битном хосте я пытаюсь собрать общие библиотеки с опцией -m32. Возможно ли связать эти библиотеки с обычными 64-битными библиотеками?

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

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?

1 Ответ

11 голосов
/ 29 октября 2010

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

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

extern void foo(void*); 

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

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

...