Как экспортировать определенный символ из исполняемых файлов в GNU / Linux

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

Есть ли способ экспортировать только определенные функции?

Например, у меня есть testlib.cpp и main.cpp, как показано ниже:

testlib.cpp

extern void func_export(int i);

extern "C" void func_test(void)
{
func_export(4);
}

main.cpp

#include <cstdio>
#include <dlfcn.h>

void func_export(int i)
{
::fprintf(stderr, "%s: %d\n", __func__, i);
}

void func_not_export(int i)
{
::fprintf(stderr, "%s: %d\n", __func__, i);
}

typedef void (*void_func)(void);

int main(void)
{
void* handle = NULL;
void_func func = NULL;
handle = ::dlopen("./libtestlib.so", RTLD_NOW | RTLD_GLOBAL);
if (handle == NULL) {
fprintf(stderr, "Unable to open lib: %s\n", ::dlerror());
return 1;
}
func = reinterpret_cast<void_func>(::dlsym(handle, "func_test"));

if (func == NULL) {
fprintf(stderr, "Unable to get symbol\n");
return 1;
}
func();
return 0;
}

Обобщение:

g++ -fPIC -shared -o libtestlib.so testlib.cpp
g++ -c -o main.o main.cpp

Я хочу, чтобы func_export использовалась динамической библиотекой, но скрыть func_not_export.

Если ссылка с -rdynamic,
g++ -o main -ldl -rdynamic main.o
обе функции экспортируются.

Если нет связи с -rdynamic,
g++ -o main_no_rdynamic -ldl main.o
Я получил ошибку во время выполнения Unable to open lib: ./libtestlib.so: undefined symbol: _Z11func_exporti

Можно ли выполнить требование экспортировать только определенную функцию?

2

Решение

Есть ли способ экспортировать только определенные функции?

Нам нужна была эта функциональность, и мы добавили --export-dynamic-symbol вариант с золотым компоновщиком Вот.

Если вы используете Gold, создайте последнюю версию, и все будет готово.

Если вы не используете Gold, возможно, вам следует — это намного быстрее и обладает необходимой вам функциональностью.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]