Как скомпилировать 32-битный двоичный файл на 64-битных машинах Linux, не касаясь переменной среды CFLAGS

Решение в

Как скомпилировать 32-битный двоичный файл на 64-битной машине Linux с помощью gcc/cmake

невозможно, потому что я использую стороннее программное обеспечение и другие вещи, которые уже используют переменную CFLAGS. И исправление их make файлов не допускается, - говорит мой босс.

Поэтому мне нужно найти другой способ его принудительного применения. Возможно, какая-то магия с символическими ссылками перенаправляет вызов gcc на 32-битную версию компилятора (надеясь, что цель по умолчанию не обнаружена динамически).

Ответ 1

Вам не разрешено изменять CFLAGS в вашей среде, но есть ли какая-то причина, по которой вы не можете временно переопределить ее для сборки?

Для пакета на основе autotool я бы сначала попытался:

CFLAGS="-m32" ./configure [opts]
make
make install

Хорошо написанный файл configure.ac должен уважать вашу переменную CFLAGS и добавлять к ней, не требуя изменения источника пакета.

Обновление

Предполагая, что вы не можете переопределить свою переменную CC, либо я бы сыграл некоторые трюки с пути. Создайте оболочку script в ${HOME}/gcc32 под названием gcc со следующим (непроверенным):

#!/bin/sh
/usr/bin/gcc -m32 "[email protected]"

Затем добавьте это к своему пути, когда вы хотите построить 32-разрядную версию:

export PATH=${HOME}/gcc32:${PATH}

Очевидные изменения будут поддерживать g++, icc или любой другой компилятор.

Ответ 2

Предположим, что gcc и друзья находятся в "/usr/bin". Предположим также, что у вас есть папка с именем ~/.local/bin, которая находится на вашем пути. Вы можете создать bash script с именем "gcc" в "~/.local/bin", например:

#! /bin/bash
/usr/bin/gcc -m32 [email protected]

Аналогичным образом вы можете создать "g++" script с содержимым следующим образом:

#! /bin/bash
/usr/bin/g++ -m32 [email protected]

В основном, продолжайте делать это для "С++", "cc", "as", "ld" и т.д. по мере необходимости. Сделайте скрипты исполняемыми. Убедитесь, что "~/.local/bin" находится в переменной среды PATH до "/usr/bin". Если это так, то когда makefile вызывает компилятор (при условии, что они используют относительные пути), вместо этого будут вызываться ваши скрипты.