GCC -m32 флаг:/usr/bin/ld: пропускать несовместимые

На 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

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

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

extern void foo(void*); 

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

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