我已经成功地在Linux x86_x64上构建了几个32位的静态和共享库,现在我试图将它们链接到一个可执行文件,并得到以下错误:
/usr/bin/ld: foo.so: __moddi3: invalid version 21 (max 0)
foo.so: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
其中foo.so是我构建的共享库之一。
__moddi3函数是的一部分。它的签署是:
— Runtime Function: long __moddi3 (long a, long b)
最近,我在OSX程序中添加了一些动态插件行为,该程序按照设计的方式工作。但是,在Linux (泛型)上尝试相同的方法失败,因为dlsym()库调用无法以在OSX中正常工作的方式解析符号。
从阅读man dlsym可以明显看出,系统调用在这两种体系结构中的实现非常不同,但我认为最基本的情况也是一样的,但显然并非如此。
下面的示例(虚拟)在OSX中运行良好,但在Linux中不起作用。
在Linux中,有什么解决办法可以让它以同样的方式解析符号吗?
// Needed to make RTLD_DEFAULT available on GNU/Linux
#define _GNU_SOURCE
#
我现在正在修一门编程语言原理课程,但我不能用我的一生来解决这个问题。这不是家庭作业,只是一个一般性的概念问题。
在我们的课堂上,我们讨论了静态链和显示。我想我理解我们为什么需要这些。否则,当我们有嵌套的方法时,我们就无法确定当我们有嵌套方法时,我们正在谈论的变量是什么。
我的教授也谈到了一个符号表。我的问题是符号表是用来做什么的?它与静态链有什么关系?
我会给一些背景(请纠正我,如果我是错的)。
(为了让解释更容易,我要定义一些东西)
假设我们有以下代码:
main(){
int i;
int j;
int k;
a(){
int i;
我使用的是Mingw64 for Windows(当然),我通常会静态链接到libwinpthread.a。但我注意到还有一个名为libpthread.a的库(没有win)。我可以看到它们有不同的大小,所以一定有不同的东西。如果我创建一个包含线程库的非常简单的程序,当我使用标记-libpthread而不是-libwinpthread时,我可以看到编译后的代码也有不同的大小。
我知道winpthread使用的是BSD许可证。在Linux中,pthread使用的是LGPL-license。那么会不会是许可证的问题呢?也许libpthread正在使用LGPL,而libwinpthread正在使用BS
在global.c文件中定义了一些全局变量,如下所示:
int globalvar;
我有一个头文件global.h将这个变量声明为extern
extern int globalVar;
现在我有了main.c,它与已编译的global.o (从global.c编译)链接,它具有打开(使用dlopen)的代码,共享对象sh.so是从sh.c构建的,通过global.h访问globalVar。尽管我的可执行文件定义了globalVar (静态链接),但是当我加载动态链接库sh.so时,它表示未定义的globalVar。怎么处理这个?
我们有一个在许多静态库中链接的程序,根据编译选项,这些程序可能定义或不定义多个符号。在OS上,我们使用带有空句柄的dlsym(3)来获取符号地址。但是,在Linux上,dlsym(3)总是返回NULL。
考虑一个简单的程序(下面的源代码),它链接到包含函数和变量的静态库中,并试图打印它们的地址。我们可以检查程序是否包含以下符号:
$ nm -C test | grep "test\(func\|var\)"
0000000000400715 T testFunc
0000000000601050 B testVar
但是,当程序运行时,两者都找不到:
$ ./test
test
SDL_android.c项目包含一个SDL2活动类(SDLActivity),它传递C库的名称,并在其中使用对nativeRunMain()的JNI调用来回调SDL_android.c。然后使用dlopen和dlsym动态调用C回调。
但是,在运行adb logcat时,nativeRunMain()说它是Couldn't find function main in library lib<android-binary>.so。
我的cc_library定义如下所示:
cc_library(
name = "main",
srcs = ["
我有一个问题,当将静态库和.o文件链接到共享的libray时缺少符号。我检查了静态libray的符号表,正常情况下,我需要在该表中列出这些函数,如下所示:
...
00000000 g F .text 000000b0 av_int2dbl
...
000000b0 g F .text 00000060 av_int2flt
但是,当我生成共享库、av_int2dbl和av_int2flt以及其他遗漏的函数(它们通常都在静态符号表中列出)时,我使用了一种愚蠢的方法来解决这个问题,通过在.o文件中创建一个虚拟函数,并引用虚拟函数中遗漏的函数,共享库的动态符号表添加了一些以前没
我正在尝试使用dladdr。它正确地定位了库,但找不到函数名。我可以调用objdump,做一些数学运算,然后获得我传递给dladdr的函数的地址。如果objdump可以看到它,为什么dladdr不能呢?
下面是我的函数:
const char *FuncName(const void *pFunc)
{
Dl_info DlInfo;
int nRet;
// Lookup the name of the function given the function pointer
if ((nRet = dladdr(pFunc, &DlInfo)) != 0)
我想学习elf文件,但当我想到全局变量、全局静态变量和作用域静态变量时,我会有一些困惑。例如:
int a = 2;
int b;
static int c = 4;
static int d;
void fun(){
static int e = 6;
static int f;
}
int main(void){
fun();
}
谁能说出每个变量属于哪个段呢?在我看来,b,d和f属于.bss段,a,c和e属于数据段,但是我不知道elf文件中全局静态变量和全局变量的区别。
我正在使用gdb分析一个核心转储文件。可执行文件链接到共享库,可执行文件和共享库都使用-g标志进行编译,在bt中,我可以看到可执行文件中的num行,但看不到共享库。有什么办法解决这个问题吗? 我以这种方式打开核心文件: gdb /path/to/executable /path/to/core/file (gdb) bt
#0 0x00007f4e7711b438 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1 0x00007f4e7711d03a in __GI_abort () a