Я хочу создать программу, способную 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 / Библиотека / GCC / x86_64-неизвестно-Linux-гну / 4.5.2 / LTO-обертка
Цель: x86_64-unknown-linux-gnu
Настраивается с:
/build/src/gcc-4.5-20110127/configure
--prefix = / usr --enable-languages = c, c ++, fortran, objc, obj-c ++, ada
--enable-shared --enable-threads = posix --enable -__ cxa_atexit --enable-clocale = gnu --enable-gnu-уникальный-объект --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 ++ используется?