gpt4 book ai didi

c++ - dlsym()'ing C++ 中的全局变量

转载 作者:IT王子 更新时间:2023-10-29 01:14:51 24 4
gpt4 key购买 nike

我想制作一个能够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 Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.5.2/lto-wrapper Target: x86_64-unknown-linux-gnu Configured with: /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-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 Thread model: posix gcc version 4.5.2 20110127 (prerelease) (GCC)


附录 2

无论出于何种原因

extern "C" {
const testunit_testcase test_suite = { ... }
}

有效,但这个有效:

extern "C" const testunit_testcase test_suite = { ... }

我现在的问题:正如我在您的一些回答中看到的那样,将 extern "C"{ ... } 括起来对您有用。是否有任何编译器标志可以用来确保 test_suite 永远不会被破坏,无论使用什么 4.x(至少)g++ 版本?

最佳答案

问题不在于名称修改。 (或者可能不是:公开变量名通常不会被破坏。)真正的问题是“const”表示隐式静态,使变量在外部不可见翻译单位。为避免这种情况,变量必须明确声明为外部。和“链接规范的形式包含大括号括起来的声明序列不影响所包含的是否声明是否是定义(3.1);的形式直接包含单个声明的链接规范是被视为外部说明符 (7.1.1) 以确定的目的包含的声明是否是一个定义。”似乎没有直接解决您的问题(存在初始化程序确保声明是一个定义),它看起来表明意图:在大括号括起的链接说明符中,适用一般规则;如果链接说明符直接应用于声明,就好像声明是显式外部的。那么你可以写:

extern "C" {
testunit_testcase const test_suite[] // ...
}

extern "C" testunit_testcase const test_suite[] // ...

但必须有一个明确适用于该定义的 extern,为了覆盖“const”的隐式“static”。

关于c++ - dlsym()'ing C++ 中的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5460482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com