使用 nm
或 objdump
这样的工具来检查 .so
文件中的符号是一个很好的方法,以确保指定函数(如uaopen_mylib
)是否存在于该共享库中。以下是使用这两个工具的方法:
一、 nm -D 动态库名
nm
命令用于列出目标文件中的符号。在 Linux 系统中,你可以使用以下命令来检查 .so
文件:
nm -D libmylib.so | grep luaopen_mylib
这里的 -D
选项表示只显示动态符号(即可以从外部访问的符号)。如果 luaopen_mylib
函数存在,你应该会在输出中看到它。
[root@? build]# nm -D libmylib.so
0000000000201040 B __bss_start
w __cxa_finalize
0000000000201040 D _edata
0000000000201048 B _end
0000000000000860 T _fini
w __gmon_start__
0000000000000668 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
U luaL_checkinteger
U luaL_newlib
0000000000000834 T luaopen_mylib
U lua_pushinteger
二、 objdump -T 动态库名
objdump
是一个显示二进制文件信息的工具,它也可以用来列出符号。以下是如何使用 objdump
来检查 .so
文件的示例:
objdump -T libmylib.so | grep luaopen_mylib
这里的 -T
选项用于显示动态符号表。如果 luaopen_mylib
函数存在,它应该在输出中显示出来。
[root@? build]# objdump -T libmylib.so
libmylib.so: 文件格式 elf64-x86-64
DYNAMIC SYMBOL TABLE:
0000000000000668 l d .init 0000000000000000 .init
0000000000000000 w D *UND* 0000000000000000 _ITM_deregisterTMCloneTable
0000000000000000 DF *UND* 0000000000000000 lua_pushinteger
0000000000000000 DF *UND* 0000000000000000 luaL_checkinteger
0000000000000000 w D *UND* 0000000000000000 __gmon_start__
0000000000000000 D *UND* 0000000000000000 luaL_newlib
0000000000000000 w D *UND* 0000000000000000 _Jv_RegisterClasses
0000000000000000 w D *UND* 0000000000000000 _ITM_registerTMCloneTable
0000000000000000 w DF *UND* 0000000000000000 GLIBC_2.2.5 __cxa_finalize
0000000000201040 g D .got.plt 0000000000000000 Base _edata
0000000000201048 g D .bss 0000000000000000 Base _end
0000000000201040 g D .bss 0000000000000000 Base __bss_start
0000000000000668 g DF .init 0000000000000000 Base _init
0000000000000860 g DF .fini 0000000000000000 Base _fini
0000000000000834 g DF .text 000000000000002b Base luaopen_mylib
请注意,你需要将 libmylib.so
替换为你实际的 .so
文件名。
三、问题集
如果 luaopen_mylib
函数不存在于输出中,那么可能的原因包括:
- 你的 C 代码中确实没有定义这个函数。
- 编译或链接过程中出现了问题,导致这个函数没有被正确地包含到
.so
文件中。 - 你可能正在查看错误的
.so
文件或版本。 - cpp文件编写时,要使用extern “C” 声明函数,不然lua api识别不了
检查这些可能的原因,并相应地修复它们。如果你有权访问源代码,确保 luaopen_mylib
函数在 C 文件中被正确定义,并且没有编译或链接错误。