2012-01-12 2 views
8

Мне нужно развернуть коробку Red Hat 4.1.2 (которая имеет gcc 4.1.2). Я использую GCC 4.6.1 на Ubuntu 11.10 для разработки. К сожалению, некоторые из двоичных файлов, которые создает мой процесс сборки, непригодны для использования на машине RedHat. Причина, по-видимому, заключается в изменении ABI, которое согласно another Stackoverflow question было результатом введения символов STT_GNU_IFUNC. Есть ли способ предотвратить экспорт любых таких символов, чтобы мой двоичный файл мог использовать старый ABI? Я использовал nm для поиска любых символов типа «i» в своем двоичном формате, но не нашел их.Как избежать символов STT_GNU_IFUNC в двоичном формате?

Я спрашиваю об этом, потому что некоторые из моих других двоичных файлов, а также некоторые сторонние библиотеки, которые я строю (tbb, boost), не используют новый ABI и поэтому отлично работают на компьютере RedHat.

Надеюсь, что это ясно. Заранее спасибо.

ответ

11

В целом, системы UNIX поддерживают обратную двоичную совместимость (двоичный файл, построенный на старой машине, продолжает работать на более новой), но не наоборот. Вы не можете ожидать, что бинарник, построенный на новой системе, будет работать на более старой. STT_GNU_IFUNC является только первых многих проблем, с которыми вы столкнетесь.

Если вам нужно построить двоичный файл на более новой машине, которая будет работать на более старой, см. Документ this.

Там раньше «apgcc: A GCC обертка сделать переносными двоичные файлы», которые сделали это легко (это ссылка сверху), но это, кажется, пошел ;-(

Самый простой вариант заключается в создании на старая машина (я использовал для сборки на RedHat 6.2, и полученный двоичный код выполнял всюду). Вам не нужно фактически запускать RH-6.2 на физическом компьютере, просто введите его в виртуальную машину.

Другой относительно простой вариант - построить в chroot, снова используя инструменты и библиотеки из старого дистрибутива (например, RH-6.2).

+0

Спасибо, это то, чего я боялся. Проблема в том, что моя среда сборки использует относительно новые возможности python и gcc. Мне нужно будет это смягчить. – samwise

+0

Обычно вы можете * создать новый Python и GCC на старой машине, а затем использовать их. Версия GCC не имеет большого значения для переносимости полученной библиотеки; только версия glibc делает. –

0

Кросс-компиляция для более старого Linux может быть очень сложной, и это лишь одна из многих проблем, с которыми вы столкнетесь.

При этом проблема совместимости с ABI может быть решена путем добавления -Wl,-fno-jump-tables.

Смежные вопросы