Как я могу связаться с определенной glibc версией?

Когда я компилирую что-то на своей Ubuntu Ясные 10,04 пк, она связана против glibc. Ясное использование 2.11 из glibc. Когда я выполняю этот двоичный файл на другом ПК с более старым glibc, сбои команды, говорящие, что нет никакого glibc 2.11...

Насколько я знаю, что glibc использует управление версиями символа. Я могу вынудить gcc связаться против определенной версии символа?

В моем конкретном использовании я пытаюсь скомпилировать перекрестный набор инструментальных средств gcc для ARM.

99
задан falstaff 26 October 2010 в 17:14
поделиться

1 ответ

Вы правы в том, что 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;
}
62
ответ дан 24 November 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: