我们有一个在许多静态库中链接的程序,根据编译选项,这些程序可能定义或不定义多个符号。在OS上,我们使用带有空句柄的dlsym(3)来获取符号地址。但是,在Linux上,dlsym(3)总是返回NULL。
考虑一个简单的程序(下面的源代码),它链接到包含函数和变量的静态库中,并试图打印它们的地址。我们可以检查程序是否包含以下符号:
$ nm -C test | grep "test\(func\|var\)"
0000000000400715 T testFunc
0000000000601050 B testVar
但是,当程序运行时,两者都找不到:
$ ./test
test
我正在使用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
我正在使用Linux机器上的二进制文件和核心文件使用gdb调试一个核心转储,其中的核心转储happened.But对于一个特定的线程1没有可用的符号表信息。对于剩下的线程,我将得到符号表。
(gdb) t 1
[Switching to thread 1 (Thread 0x7f799659f700 (LWP 12275))]#0 0x00007f799cead4b0 in __tls_get_addr () from /lib64/ld-linux-x86-64.so.2
(gdb) frame 0
#0 0x00007f799cead4b0 in __tls_get_addr () f
我正在查看debug/gosym包,它的类型是gosym.Table,据说是Go可执行文件的符号表。不幸的是,我看不到任何从正在运行的程序中提取sysmbol表的方法(Go反射是缺乏的,我需要比它所能提供的更多的信息,特别是导出符号的名称)。
如果这通常是不可能的,但可以在Linux / for ELF二进制文件上完成,这也是一个选择。
最近,我在OSX程序中添加了一些动态插件行为,该程序按照设计的方式工作。但是,在Linux (泛型)上尝试相同的方法失败,因为dlsym()库调用无法以在OSX中正常工作的方式解析符号。
从阅读man dlsym可以明显看出,系统调用在这两种体系结构中的实现非常不同,但我认为最基本的情况也是一样的,但显然并非如此。
下面的示例(虚拟)在OSX中运行良好,但在Linux中不起作用。
在Linux中,有什么解决办法可以让它以同样的方式解析符号吗?
// Needed to make RTLD_DEFAULT available on GNU/Linux
#define _GNU_SOURCE
#
从昨天起,我对linux还很陌生。我正在使用linux小狗,试图从一个10岁的,缓慢的笔记本电脑中得到最大的好处。我安装的很好,没有问题,但是一旦我尝试使用我的usb的安装CD,问题就开始了。
CD包括对linux和windows的支持,因此我从CD中复制了linux文件,并通过控制台运行install.sh文件以方便安装驱动程序。一切看起来都很顺利直到..。我得到以下错误:
make: *** /lib/modules/2.6.37.6/build: No such file or directory. Stop.
然后显示错误2消息。
这是我唯一能找到的关于它的任何信息的web结果,但是我
我已经安装了Linux x64 14.04和Python3.4(默认安装由Ubuntu)。如果打开CudaText文本编辑器,它无法在控制台中导入ctypes:
>>>> import ctypes
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib/python3.4/ctypes/__init__.py", line 7, in <module>
from _ct
我使用的是Mingw64 for Windows(当然),我通常会静态链接到libwinpthread.a。但我注意到还有一个名为libpthread.a的库(没有win)。我可以看到它们有不同的大小,所以一定有不同的东西。如果我创建一个包含线程库的非常简单的程序,当我使用标记-libpthread而不是-libwinpthread时,我可以看到编译后的代码也有不同的大小。
我知道winpthread使用的是BSD许可证。在Linux中,pthread使用的是LGPL-license。那么会不会是许可证的问题呢?也许libpthread正在使用LGPL,而libwinpthread正在使用BS