Заменить все вызовы функции версией символа - PullRequest
0 голосов
/ 09 июля 2020

Я использую относительно современный компилятор, который связывается с более новыми версиями определенных библиотек, поскольку вы, возможно, уже знаете, что это происходит.

Из-за этого мне нужно связать некоторые старые функции в GLIB C, один из которых - fcntl. В настоящее время приложение и его зависимости связываются с fcntl@GLIBC_2.28, я требую, чтобы все они были связаны с fcntl@GLIBC_2.4.

Конечно, в моих собственных исходных файлах я могу добавить __asm__(".symver fcntl,fcntl@GLIBC_2.4");, но это есть ли способ полностью перезаписать эти функции более старой версией? Если бы я мог перезаписывать каждый вызов функции через мой CMakeLists.txt или что-то подобное, мне не нужно было бы добавлять исходный код во внешние библиотеки, такие как git репозитории.

Есть ли способ добиться это?

Tl; Dr: Я ищу способ глобально перезаписывать каждый вызов fcntl на fcntl@GLIBC_2.4.

1 Ответ

2 голосов
/ 11 июля 2020

Конечно, в моих собственных исходных файлах я могу добавить __asm__(".symver fcntl,fcntl@GLIBC_2.4");

Игра с ABI, подобная этой, может вызвать всевозможные проблемы во время выполнения, от сбоев во время выполнения до утечек памяти, для переполнения стека.

Имеется причина версия символа была изменена. Вы используете более новые заголовки со старой средой выполнения, и ваша программа полностью соответствует неопределенному поведению земле.

Правильный способ сделать это - использовать правильную среду сборки. Подробнее здесь .

...