Синтаксис gcc для компиляции 32-битных программ на 64-битной платформе
У меня есть проприетарная программа, которую я пытаюсь использовать на 64-битной системе.
Когда я запускаю настройку, он работает нормально, но после этого пытается обновить себя и скомпилировать некоторые модули, и он не сможет их загрузить.
Я подозреваю, потому что он использует gcc и gcc пытается скомпилировать их для 64-битной системы, и поэтому эта программа не может использовать эти модули.
Есть ли какой-либо способ (некоторые переменные окружения или что-то в этом роде), чтобы заставить gcc делать все для 32-битной платформы. Будет ли работать 32-битный chroot?
Ответы
Ответ 1
Вам нужно, чтобы GCC использовал флаг -m32
.
Вы можете попробовать написать простую оболочку script для своего $PATH
и называть ее gcc (убедитесь, что вы не перезаписываете исходный gcc и убедитесь, что новый script появился раньше в $PATH
, и что он использует полный путь к GCC.
Я думаю, что код, в котором вы нуждаетесь, просто что-то вроде /bin/gcc -m32 $*
в зависимости от вашей оболочки ($*
должен содержать все аргументы, хотя это может быть что-то еще - очень важно!)
Ответ 2
Вы можете получить 32-битный двоичный код, применяя метод Алана Пирса, но вы также можете получить ошибки следующим образом:
fatal error: bits/predefs.h: No such file or directory
Если это так, и если у вас есть apt-get, просто установите gcc-multilib
sudo apt-get install gcc-multilib
Ответ 3
Для любого кода, который вы компилируете непосредственно с помощью gcc
/g++
, вам нужно добавить параметр -m32
в командную строку компиляции, просто отредактируйте переменные CFLAGS
, CXXFLAGS
и LDFLAGS
в ваш Makefile
.
Для любого стороннего кода, который вы используете, вы должны убедиться, что при его создании для его настройки для кросс-компиляции. Запустите ./configure --help
и посмотрите, какая опция доступна. В большинстве случаев вы можете предоставить переменные CFLAGS
, CXXFLAGS
и LDFLAGS
для configure script. Вам также может потребоваться добавить --build
и --host
в конфигурацию script, чтобы вы получили что-то вроде
./configure CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32 --build=x86_64-pc-linux-gnu --host=i686-pc-linux-gnu
Если компиляция завершилась неудачно, это, вероятно, означает, что вам необходимо установить 32-разрядные пакеты разработки на 64-разрядной машине