Я хочу создать программу, которая может dlopen ()
ряд библиотек (написанных мной) и запустить все функции, хранящиеся в глобальной переменной с именем test_suite
внутри этого файла .so, который представляет собой массив указателей на функции с завершающим NULL (сигнатуры функций предопределены мной, не о чем беспокоиться).
Проблема в том, что g ++ искажает эту переменную. Библиотека скомпилирована как:
g++ -Wall -shared -rdynamic -fPIC foo.cpp -o foo.so
, а «индекс функции» объявлен и размещен статически как:
const testunit_testcase test_suite = { ... }
еще
objdump -t foo.so | grep test_suite
показывает:
0000000000200940 l O .data.rel.ro 0000000000000020 _ZL10test_suite
Мне нужно
0000000000200940 l O .data.rel.ro 0000000000000020 test_suite
Так что я могу dlsym (dlh , "test_suite")
в программе dlopen ()
'ing foo.so
Спасибо
Дополнение
Да, extern "C"
было первым, что я попробовал:
extern "C" {
const testunit_testcase test_suite[] = {
//TESTUNIT_DEF_TESTCASE(doTest),
{NULL, NULL},
};
}
Я использую:
g ++ -v Используя встроенные спецификации. COLLECT_GCC = g ++ COLLECT_LTO_WRAPPER = / usr / lib / gcc / x86_64-unknown-linux-gnu / 4.5.2 / lto-wrapper Цель: x86_64-unknown-linux-gnu Настроен с: /build/src/gcc-4.5-20110127[11128751 impression/configure --prefix = / usr --enable-languages = c, c ++, fortran, objc, obj-c ++, ada --enable-shared --enable-thread = posix --enable -__ cxa_atexit --enable-clocale = gnu --enable-gnu-unique-object --enable-lto --enable-plugin --enable-gold - with-plugin-ld = ld.gold --disable-Multilib --disable-libstdcxx-pch --with-system-zlib --with-ppl --with-cloog --with-cloog-include = / usr / include / cloog-ppl --libdir = / usr / lib --libexecdir = / usr / lib --mandir = / usr / share / man --infodir = / usr / share / info Модель потока: posix gcc версии 4.5.2 20110127 (предварительная версия) (GCC)
Приложение 2
По каким-либо причинам
extern "C" {
const testunit_testcase test_suite = { ... }
}
не работает не , НО это работает:
extern "C" const testunit_testcase test_suite = { ... }
Теперь мой вопрос : Как я вижу в некоторых из ваших ответов заключите extern "C" {...}
. Могу ли я использовать какие-либо флаги компилятора, чтобы убедиться, что test_suite
никогда не будет искажен, независимо от того, какая версия 4.x (по крайней мере) g ++ используется?