下面创建的 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 都是一样的,但我错了。为什么 这两个可执行文件是否不同以及上述命令的哪一部分导致了这些 差异? 不同之处在于,在执行 launch 时,我不必设置 LD_LIBRARY_PATH 变量并将其导出到 libshared_secure.so 的路径,但在执行 launch1 时我必须这样做。
最佳答案
readelf -d launch | grep libshared_secure.so
将报告[./my_lib/libshared_secure.so]
。但是,对于 launch1
,它将是 [libshared_secure.so]
。链接器将尝试在系统目录和相对于您当前工作目录的目录中加载给定的库(因此,如果您将从其他地方启动二进制文件(不是 ./launch
而是例如 . ./launch
从子目录) - 它不会找到没有 LD_LIBRARY_PATH
的库)。
其他功能是 rpath - 链接器可以获取要查看的目录,并将其写入 ELF header ,而无需指定 LD_LIBRARY_PATH。这避免了当前工作目录的问题,因为您可以使用相对于二进制目录的路径,而不是当前目录。例如。 gcc -Wl,-rpath='$ORIGIN/my_lib' -Lmy_lib -lshared_secure main.o
会将您的二进制文件与 libshared_secure.so
链接,但会将相关条目添加到 rpath
.
关于c - 从共享库创建可执行文件的命令差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23908528/