GCC / LD - создайте новый libc.so с __isoc99_sscanf @@ символ glibc_2.7 из glibc.2.6

StackOverflow https://stackoverflow.com/questions/3660826

Вопрос

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

/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» ошибка от линкера.

Это было полезно?

Решение

я нашел @felipecS Ответ очень полезно. Кроме того, наше приложение пришлось сделать некоторую динамическое соединение с помощью Ocaml, и мы обнаружили, что данный скрипт не работает для этого сценария, поскольку он делает приложение только экспортировать символ __ISOC99_SSCANF как глобальный.

GLIBC_2.7 {
 global: *;
};

Приведенный выше скрипт решает эту проблему и позволяет правильно работать динамический линкер Ocaml. с использованием -D_GNU_SOURCE Опция в одиночестве было недостаточно, чтобы избежать этой проблемы, поскольку зависимость от Glibc_2.7 пришла из предварительно продуманного двоина, с которыми мы были статически связаны с.

Другие советы

Ваша вторая версия работает с этим скриптом:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top