c - .so 文件如何查找符号?
问题描述
我有一个 .so 文件,其中包含一些extern
函数声明。这些函数的定义在我链接到的二进制文件中。so 文件。但是在链接时我收到未定义的参考错误。
有什么方法可以在 .so 的 makefile 中提供一些路径以进行符号查找。
我曾经objdump
在 .so(extern declaration) 和 .o(actual definition-different directory) 中列出符号,我看到两个地方都有相同的符号。
/homes/uakash/cmd/usr/lib64$ objdump -T libcpld-cmd.so.0 | grep Parent
:::::
0000000000000000 D *UND* 0000000000000000 _Z29getParentCpldIFDOFromPreviousSt10shared_ptrIN3net74cpld14ParentCpldIFDOEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
::::
/homes/uakash/src/usr/sbin/l$ objdump -t cpld_cmd.o | grep Parent
::::
00000000000000d0 g F .text 0000000000000600 _Z29getParentCpldIFDOFromPreviousSt10shared_ptrIN3net74cpld14ParentCpldIFDOEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
::::
解决方案
您似乎对共享库的工作方式有误解。.so 文件包含定义,.o 文件也是如此。一种用于动态链接,另一种用于静态链接。您需要使用 on 或其他,但不能同时使用两者。
例如,给定您的共享共享库libcpld-cmd.so
,并且您希望将其链接到您的代码与源代码main.c
,例如,然后:
gcc main.c -lcpld-cmd.so -o myprogram
链接器将处理 cpld-cmd.so 以解析符号,但实际上不会链接其中的目标代码 - 那将是一个静态链接。
然后运行myprogram
时,库必须可用,并且操作系统加载程序将在运行时动态链接库代码。
参考:http ://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
另一方面,如果您想静态链接,您将链接cpld-cmd.o
.so 文件不起作用,也不是必需的 - 所有代码都静态链接到 .so 文件中myprogram
。
gcc main.c cpld-cmd.o -o myprogram
推荐阅读
- java - 通过随机访问文件读取文件段
- php - Telegram bot php - 广播位置 - 如何读取更改?
- python - IndentationError:意外缩进 - 在字符串中使用变量
- json - 将多个列表列转换为pyspark数据框中的json数组列
- python - 使用 concurrent.futures 模块的 Python 线程
- kubernetes - OpenVPN-Client Pod on K8s - Local network unreachable
- buddypress - BuddyPress 个人资料页面的附加自定义页面构建挂钩
- python - 从列值显示散点图标题
- android - Jetpack Compose 现有多模块应用程序中的依赖项
- sql - 您是否需要全面验证数据库和应用程序中的数据?