gcc / ld - создайте новый libc.so с символом __isoc99_sscanf @@ GLIBC_2.7 из glibc.2.6 - PullRequest
5 голосов
/ 07 сентября 2010

У меня есть приложение, которое выдает ошибку при попытке запустить его:

/lib/libc.so.6: version `GLIBC_2.7' not found

Но единственный символ, который ему нужен от glibc 2.7 - это

__isoc99_sscanf@@GLIBC_2.7 

Я хочу написать небольшую одиночную функцию "библиотека" с этим символом в качестве псевдонима для __sscanf ()

Как я могу сделать это с помощью gcc / ld?

Мой вариант не принят, потому что символы "@@"

 int __isoc99_sscanf@@GLIBC_2.7(const char *, const char *, ...) __attribute__((alias("__sscanf")));

второй мой вариант

#include <stdarg.h>
int __isoc99_sscanf1(const char *a, const char *b, va_list args)
{
   int i;
   va_list ap;
   va_copy(ap,args);
   i=sscanf(a,b,ap);
   va_end(ap);
   return i;
}

   // __asm__(".symver __isoc99_sscanf,__isoc99_sscanf@@GLIBC_2.7");
    __asm__(".symver __isoc99_sscanf1,__isoc99_sscanf@@GLIBC_2.7");

но он заканчивается сообщением об ошибке "узел версии не найден для символа __isoc99_sscanf @@ GLIBC_2.7".

Ответы [ 2 ]

4 голосов
/ 27 сентября 2010

Ваша вторая версия работает с этим сценарием:

GLIBC_2.7 {
 global: __isoc99_sscanf;
 local: *;
};

Использование -Wl,--version-script=script.txt, однако, я не знаю, как получить доступ к оригиналу sscanf@GLIBC_2.4.

В любом случае, возможновы бы хотели использовать -D_GNU_SOURCE вместо этого;чтобы избежать __isoc99_sscanf в целом.

2 голосов
/ 28 марта 2011

Я нашел ответ @felipec очень полезным.Кроме того, наше приложение должно было выполнить динамическое связывание с использованием ocaml, и мы обнаружили, что данный сценарий не работает для этого сценария, поскольку он заставляет приложение экспортировать только символ __isoc99_sscanf как глобальный.

GLIBC_2.7 {
 global: *;
};

приведенный выше сценарий решает эту проблему и позволяет динамическому компоновщику ocaml работать правильно.использование одной опции -D_GNU_SOURCE было недостаточно, чтобы избежать этой проблемы, поскольку зависимость от GLIBC_2.7 исходила из предварительно скомпилированного двоичного файла, с которым мы статически связывались.

...