Можете ли вы скомпилировать 32-битные Apache DSO (сервер Oracle HTTP) на 64-битной машине?
-
22-08-2019 - |
Вопрос
Я перенес базу данных Oracle и установку HTTP-сервера Oracle с 32-разрядной машины на 64-разрядную машину — обе машины работают под управлением Linux.База данных Oracle является 64-битной, а HTTP-сервер (Apache) — 32-битным.
Я использую некоторые DSO, отличные от Oracle (например, mod_ntlm), но всякий раз, когда я запускаю стандартную команду типа «make install», я получаю 64-битный модуль.
Существует ли стандартный способ компиляции 32-битных модулей Apache на 64-битной машине?
Решение
В качестве альтернативы ответу Эндрю Медико используйте '-m32
' для 32-битных компиляций и '-m64
' для 64-битных компиляций на машинах PPC, SPARC или Intel - поскольку вы фактически не указываете, какую архитектуру чипа вы используете, и эта нотация работает на всех них.
Я часто использую:
CC="gcc -m32" ./configure
для обеспечения 32-битной компиляции (или, чаще, CC="gcc -m64"
для обеспечения 64-битной компиляции).
Вопрос:«Является ли CC переменной среды, используемой make?»
Отвечать:Да, хотя в данном случае это тоже признается configure
, который представляет собой сценарий оболочки, созданный autoconf
.Обозначение, которое я использовал (то, что я использую в командной строке), устанавливает CC в среде, в то время как configure
команда выполняется.Другой ответ предлагает использовать:
./configure CC="gcc -m32"
Я предполагаю, что это работает и дает примерно тот же эффект;Я не пробовал, поэтому не знаю, работает ли это.
Если ты бежишь ./configure --help | less
, вы увидите информацию (часто просто стандартную информацию) о том, как использовать скрипт.И в конце будут перечислены (некоторые) соответствующие переменные среды, одной из которых является CC.
Преимущество установки компилятора C на «gcc -m32» заключается в том, что 32-битный флаг устанавливается каждый раз, когда используется компилятор — вероятность ошибок очень мала.Если вы установите переменную flags (CFLAGS и т. д.), есть вероятность, что какая-то команда не будет ее использовать, и тогда все может пойти наперекосяк.
Кроме того, возвращаясь к вопросу, make
обязательно использует переменную (макрос) с именем CC.И вы можете установить это в командной строке make:
make CC="gcc -m32"
Это переопределяет любые настройки в make-файле.Напротив, при использовании переменной среды настройка в make-файле переопределяет значение в среде, поэтому установка CC в качестве переменной среды менее полезна.Хотя make -e
дает среде приоритет над make-файлом, обычно это опасный вариант, поскольку он может иметь неожиданные побочные эффекты.
Другие советы
./configure CFLAGS="-march=i686"
должен это сделать
Наряду с флагом -m32 в gcc вам может потребоваться включить флаг -melf_i386 для ld, чтобы правильно связать 32-битные объектные файлы с 32-битными библиотеками, если у вас есть как 32-битные, так и 64-битные библиотеки.Стандартный ld в 64-битных Linux-системах по умолчанию использует 64-битные библиотеки, и при связывании вы получаете ошибку совместимости.