Вызывая слабый и сильный символ функции? - PullRequest
0 голосов
/ 07 мая 2019

У меня есть библиотека, которая предоставляет функцию func ():

return_type func(type arg);

Необходимо было переопределить ее моей собственной реализацией в моем приложении.Это стало возможным, поскольку библиотека предоставляет слабый символ func, а символ func в моем приложении - сильный.(Это мое понимание.)

Теперь я хочу иметь возможность вызывать как реализации func-библиотеки, так и мою собственную реализацию:

// The problem is that the names are the same.
func(); // Everything is OK, calling my implementation (in my application)
func(); // How can I call library's implementation now?

Я могу вызывать мою реализацию, потому что она переопределяетреализация в библиотеке.Но как я могу назвать реализацию в библиотеке?Как я могу сослаться на это?

1 Ответ

1 голос
/ 07 мая 2019

Если функции находятся в разделяемых библиотеках, вы можете загрузить их с помощью dlopen и получить символы из dlsym. Затем вы можете иметь разные указатели функций для функций из каждой библиотеки.

Если функции находятся в статической библиотеке, вам нужно изменить статическую библиотеку, чтобы изменить имя. Это может быть сделано с чем-то вроде objcopy --prefix-symbols=foo_ foo.o. Не уверен, что в таком случае это можно сделать непосредственно на .a, возможно, вам придется расширить архив.

После добавления префикса вам нужно будет изменить любые заголовочные файлы, чтобы они брали новые имена, используя макрос или что-то подобное.

...