c - 以root权限运行C语言时无法链接动态库?
问题描述
我有一个名为的 C 语言文件testFunc.c
,它使用动态库libCfunc.so
。该库位于 path 下/home/cuiyujie/workspace/library/lib
。
我在库路径中添加了这个路径,export LD_LIBRARY_PATH=/home/cuiyujie/workspace/library/lib:$LD_LIBRARY_PATH
当我使用以下命令编译时,可以正常编译。
gcc testFunc.c -lCfunc -lm -O0 -g -o testFunc
但是当我运行它时,如果我使用./testFunc
,它可以正常运行。
但是如果我使用sudo ./testFunc
,他会得到以下错误。
./testFunc:加载共享库时出错:libCfunc.so:无法打开共享对象文件:没有这样的文件或目录
我在谷歌上发现,当使用 root 时,LD_LIBRARY_PATH
变量的值被忽略了。我使用以下命令重新编译。编译时指定库路径。
gcc testFunc.c -L/home/cuiyujie/workspace/library/lib -lCfunc -lm -O0 -g -o testFunc
当我继续使用该sudo ./testFunc
命令运行时,仍然会出现相同的错误。
之所以需要用root执行,是因为需要读取一些只有root权限才能读取的查询。我想获取某些变量的物理地址,所以需要读取进程的映射文件,需要root权限。
解决方案
链接器标志-L
只是告诉链接器在链接时在哪里寻找库(或库存根,如果使用的话)。它不会影响运行时的库搜索路径。
对于系统范围内安装的库,您可以将库放置在全局链接器搜索路径中配置的位置,/etc/ld.so.conf
通过/etc/ld.so.conf.d
.
但是,完全可以通过所谓的rpath指定特定于某些二进制文件的附加搜索路径。rpath 是使用(你猜对了)rpath
额外的链接器标志设置的-Wl,-rpath
。
将程序与
gcc -o … -Wl,-rpath='${ORIGIN}' …
将使 ELF 解释器(加载 ELF 二进制文件并进行动态链接的代码段)也在程序二进制文件旁边查找其他库。您可以在手册页中阅读 rpaths 的详细信息ld.so
。
请注意,rpath 会调用某些安全注意事项。
推荐阅读
- c# - Asp.net MVC DropDownListFor 来自模型的列表列表
- android - 如何编写 Room Dao 查询以在 Android 中基于单表中的可选多列搜索唯一数据?
- flutter - 在 Flutter 中使用 awesome_notifications 显示通知的问题
- angular - 从角度模板多次调用方法
- java - Java:将 HEX 字节数组转换为 16 个固定长度的二进制字符串
- python - confluent-kafka python客户端版本适用于confluent-kafka 5.5.1版本
- amp-html - 从 amp 电子邮件提交表单时如何发送 amp-state?
- unity3d - 只有在另一个完成后才执行方法
- visual-studio-code - 无法使用 cmd 代码在 ubuntu 上的 WSL bash 中打开 vscode
- botframework - 如何从以前的聊天中隐藏/禁用自适应卡片按钮?