Когда я компилирую что-то на своей Ubuntu Ясные 10,04 пк, она связана против glibc. Ясное использование 2.11 из glibc. Когда я выполняю этот двоичный файл на другом ПК с более старым glibc, сбои команды, говорящие, что нет никакого glibc 2.11...
Насколько я знаю, что glibc использует управление версиями символа. Я могу вынудить gcc связаться против определенной версии символа?
В моем конкретном использовании я пытаюсь скомпилировать перекрестный набор инструментальных средств gcc для ARM.
Вы правы в том, что glibc использует версионность символов. Если вам интересно, реализация версионирования символов, представленная в glibc 2.1, описана здесь и является расширением схемы версионирования символов Sun, описанной здесь.
Одним из вариантов является статическое связывание бинарных файлов. Это, вероятно, самый простой вариант.
Вы также можете собрать свой двоичный файл в среде сборки chroot или используя кросс-компилятор glibc-new => glibc-old.
Согласно сообщению http://www.trevorpounds.com в блоге Linking to Older Versioned Symbols (glibc), можно заставить любой символ быть связанным со старым, если он действителен, используя ту же .symver
псевдо-опцию, которая используется для определения версионных символов в первую очередь. Следующий пример взят из сообщения в блоге.
Следующий пример использует realpath glibc, но убеждается, что он слинкован с более старой версией 2.2.5.
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
__asm__(".symver realpath,realpath@GLIBC_2.2.5");
int main()
{
const char* unresolved = "/lib64";
char resolved[PATH_MAX+1];
if(!realpath(unresolved, resolved))
{ return 1; }
printf("%s\n", resolved);
return 0;
}