栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

构建一个使用ld选项-rpath和$ ORIGIN的简单(hello-world-esque)示例

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

构建一个使用ld选项-rpath和$ ORIGIN的简单(hello-world-esque)示例

(我宁愿拥有

[foo.sh]
[lib/foo.sh]
但稍后再解决)。

大部分问题是您的:

/
名称中的阻止了动态链接器执行rpath魔术。

(您的rpath也是错误的。考虑一下:从shell程序中,如果您当前位于可执行文件所在的目录中,您将如何到达库所在的目录?在这里,您需

cd../lib
要这样做。因此,您的rpath应该是
$ORIGIN/../lib
。)

如果您将对象构建为

libfoo.so
并与链接
-Llib-lfoo
,则链接器将确定您的意图,并做正确的事情。但是,如果您要使用不同寻常的命名约定,则必须提供帮助:

  1. 更改库的链接行,以将您的库的SONAME显式设置为just
    foo.sh

g++ -shared -Wl,-soname,foo.sh -o lib/foo.sh obj/foo.o

  1. 修复rpath:

g++ -o run/main.run obj/main.o -Wl,-rpath,'$ORIGIN/../lib' -Llib -l:foo.sh

奔跑

ldd main/main.run
看看发生了什么,这很有用。在最初的失败案例中,您会看到类似以下内容的信息:

    lib/foo.sh (0xNNNNNNNN)

(缺少任何

=> /some/resolved/path
表明未完成任何路径解析的信息)。在固定情况下,您会看到类似以下内容的内容:

    foo.sh => /your/path/to/run/../lib/foo.sh (0xNNNNNNNN)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/405788.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号