使用 nm 或 objdump 工具检查 .so 文件指定函数是否存在

        使用 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 函数不存在于输出中,那么可能的原因包括:

  1. 你的 C 代码中确实没有定义这个函数。
  2. 编译或链接过程中出现了问题,导致这个函数没有被正确地包含到 .so 文件中。
  3. 你可能正在查看错误的 .so 文件或版本。
  4. cpp文件编写时,要使用extern “C” 声明函数,不然lua api识别不了

检查这些可能的原因,并相应地修复它们。如果你有权访问源代码,确保 luaopen_mylib 函数在 C 文件中被正确定义,并且没有编译或链接错误。

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值