Здравствуйте!
Такая проблема, допустим у меня есть какая-то shared-object (SO), в которой есть глобальная процедура
void extern "C" __attribute__ ((visibility("default"))) foo(void)
{
printf ("I am foo of first SO!\n");
}
SO компилится с -fvisibility=hidden (компилер = g++), то есть в итоге мы будем видеть этот фу...
Вооот,... теперь мы создаём вторую SO, в которую добавляем еналогичную процедуру (более того - одноимённую)
void extern "C" __attribute__ ((visibility("default"))) foo(void)
{
printf ("I am foo of second SO!\n");
}
И главное - ЛИНКУЕМ ВТОРУЮ БИБЛИОТЕКУ С ПЕРВОЙ!!!
Внимание вопрос: Какие флаги мне нужно передавать в линкуовку либы 2, чтобы в неё добавлялось тело функции именно этой библиотеки (то есть foo 2-ой либы)
А то получается, например:
typedef void (*FOO)();
FOO foo1;
FOO foo2;
void *handle1 = dlopen("lib1.so", RTLD_GLOBAL | RTLD_LAZY | RTLD_NODELETE);
void *handle2 = dlopen("lib2.so", RTLD_GLOBAL | RTLD_LAZY | RTLD_NODELETE);
foo1 = (FOO)dlsym(handle1,"foo");
foo2 = (FOO)dlsym(handle2,"foo");
foo1();
foo2();
------------RESULT---------
I am foo of first SO!
I am foo of first SO!
вместо
I am foo of first SO!
I am foo of second SO!
То есть глобалы не затираются, а берутся из старой либы, которую я прилинковываю к текущей.
В Винде всё это разруливается каким-то образом, а вот в линуксе возникают проблемы.
Кто нибудь знает какие это заветные флаги позволяющие затирание телами второй либы тел первой?!
Спасибо.