Как избежать символов STT_GNU_IFUNC в вашем двоичном файле? - PullRequest
8 голосов
/ 13 января 2012

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

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

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

Ответы [ 3 ]

10 голосов
/ 13 января 2012

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

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

Раньше было "apgcc: Оболочка GCC для создания переносимых двоичных файлов", которая делала это простым (на него ссылаются сверху), но, похоже, его уже нет; - (

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

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

0 голосов
/ 28 августа 2018

Поскольку APGCC больше не доступен. Эти заголовки glibc , по-видимому, в настоящее время являются наиболее удобным способом генерации переносимых двоичных файлов Linux из кода C путем включения одного из старых файлов заголовков.

0 голосов
/ 29 апреля 2017

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

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

...