dlsym () 'с глобальной переменной в C ++

Я хочу создать программу, которая может 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 ++ используется?

5
задан Flavius 28 March 2011 в 15:39
поделиться