С помощью gcc и ld на linux x86_64 мне нужно связать с более новой версией библиотеки (glibc 2.14), но исполняемый файл должен запускаться в системе со старой версией (2.5). Поскольку единственным несовместимым символом является memcpy (требуется [email protected]_2.2.5, но библиотека, предоставляющая [email protected]_2.14), я хотел бы сказать компоновщику, что вместо того, чтобы брать версию по умолчанию для memcpy, она должна взять старую версию, которую я указываю.
Я нашел довольно непростой способ сделать это: просто укажите копию старого .so файла в командной строке компоновщика. Это отлично работает, но мне не нравится идея наличия нескольких файлов .so(я мог бы заставить его работать, указав все старые библиотеки, на которые я ссылаюсь, и ссылки на memcpy), которые были проверены в svn и необходимы моей системе сборки.
Итак, я ищу способ сообщить компоновщику взять старый символ с версией.
Альтернативы, которые не работают (ну) для меня:
- Использование asm.symver(как видно на Веб-архив блога Trevor Pounds), так как это потребует от меня убедиться, что symver перед всем кодом, использующим memcpy, который будет очень сложным (сложная кодовая база с сторонним кодом).
- Поддержка среды сборки со старыми библиотеками; просто потому, что я хочу развиваться на своей настольной системе, и это будет лаваш для синхронизации в нашей сети.
Когда мы думаем обо всех заданиях, которые делает компоновщик, это не похоже на тяжелое дело для imlpement, ведь у него есть код, который также будет определять версию символа по умолчанию.
Любые другие идеи, которые находятся на том же уровне сложности, что и простая компоновка командной строки (например, создание простого компоновщика script и т.д.), также приветствуются, если они не странные хаки, как редактирование полученного двоичного файла..
изменить
Чтобы сохранить это для будущих читателей, помимо приведенных ниже идей, я нашел вариант --wrap
для компоновщика, который иногда может быть полезным.