Все еще сообщает "неопределенный символ: new_add" после использования - PullRequest
1 голос
/ 13 октября 2010

Мне нужно загрузить две динамические библиотеки, и есть конфликт между именами одной функции. Поэтому я использую команду "objcopy --redefine-sym add = new_add libmy_test.so libmy_test_new.so", чтобы изменить имя символа.

Но он по-прежнему сообщает "Ошибка: ./libmy_test_new.so: неопределенный символ: new_add"

Ниже приведены мои тестовые коды.

void *lib_handle2 = dlopen("./libmy_test_new.so", RTLD_NOW);
if (NULL == lib_handle2) {
    printf("Error: %s\n", dlerror());
    goto err1;
}

fp_add f_add2 = dlsym(lib_handle2, "new_add");
if (NULL == f_add2) {
    printf("Error: %s\n", dlerror());
    goto err2;
}

1 Ответ

2 голосов
/ 13 октября 2010

Согласно этой странице кажется, что она не работает с динамическим символом.Более подробное объяснение доступно в оригинальной теме .Если вы хотите использовать оба символа, то вам как-то нужно повторно связать одну из библиотек.Однако, если вам нужен только один символ, то порядок связывания может вам помочь.

Возможно, решение заключается в создании библиотеки-оболочки, в которой вы открываете две библиотеки, создаете два новых символа и назначаете их с помощью dlsymс правильным дескриптором.

void *lib_handle1 = dlopen("./lib1.so", RTLD_NOW);
void *lib_handle2 = dlopen("./lib2.so", RTLD_NOW);

fp_add f_add1 = dlsym((lib_handle1, "add");
fp_add f_add2 = dlsym(lib_handle2, "add");

Конечно, это не решает проблему вызова, генерируемого внутри библиотек.

...