【问题标题】:Difference in commands to create executables from shared library从共享库创建可执行文件的命令差异
【发布时间】:2014-05-28 10:01:31
【问题描述】:

以下创建的launch和launch1可执行文件有什么区别 命令:

gcc main.o ./my_lib/libshared_secure.so -o launch 

gcc main.o -L ./my_lib -lshared_secure -o launch1

这里的main.o是main函数的目标代码,libshared_secure.so是共享的 图书馆。我预计 launch 和 launch1 都是一样的,但我错了。为什么 这两个可执行文件是否不同,上述命令的哪一部分导致这些 差异? 不同之处在于,在执行启动时,我不必设置和导出 LD_LIBRARY_PATH 变量到 libshared_secure.so 的路径,但我必须在执行启动时这样做。

【问题讨论】:

  • 你可以运行file launchfile launch1

标签: c gcc shared-libraries


【解决方案1】:
readelf -d launch | grep libshared_secure.so

将报告[./my_lib/libshared_secure.so]。但是,对于launch1,它将是[libshared_secure.so]。链接器将尝试在系统目录和相对于您当前工作目录的目录中加载给定的库(因此,如果您将从其他地方启动二进制文件(不是./launch,而是例如来自子目录的../launch) - 它不会找到没有LD_LIBRARY_PATH 的库)。

其他功能是 rpath - 链接器可以查看目录并将其写入 ELF 标头,而无需指定 LD_LIBRARY_PATH。这避免了当前工作目录的问题,因为您可以使用相对于二进制目录的路径,而不是当前目录。例如。 gcc -Wl,-rpath='$ORIGIN/my_lib' -Lmy_lib -lshared_secure main.o 会将您的二进制文件与 libshared_secure.so 链接,但会将相对条目添加到 rpath

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2016-09-08
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多