微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以root权限运行C语言时无法链接动态库?

如何解决以root权限运行C语言时无法链接动态库?

我有一个名为 testFunc.c 的 C 语言文件,它使用动态库 libCfunc.so。此库位于路径 /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:不能 打开共享对象文件:没有那个文件或目录

我在 Google 上发现,当使用 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 二进制文件并执行动态链接的代码段)在程序二进制文件旁边寻找其他库。您可以在 ld.so 联机帮助页中阅读有关 rpath 的详细信息。

请注意,rpath 会调用某些安全注意事项。

,

LD_LIBRARY_PATH 是一个环境变量,每个用户的所有环境变量都是单独存在的。

当您在普通用户下导出它,然后使用 sudo 以 root 身份运行可执行文件时,新进程的导出不存在。

您可以使用 -E 参数保护用户的环境:

sudo -E ./testFunc

或者您可以像这样专门保留 LD_LIBRARY_PATH 变量:

sudo LD_LIBRARY_PATH=/home/cuiyujie/workspace/library/lib:$LD_LIBRARY_PATH ./testFunc

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。