以下创建的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是共享的 图书馆。我预计启动和启动1都会相同,但我不正确。为什么 两个可执行文件是不同的,上述命令的哪一部分导致这些 区别在哪里? 不同之处在于,在执行启动时,我不必将LD_LIBRARY_PATH变量设置并导出到libshared_secure.so的路径,但我必须在执行launch1时执行此操作。
答案 0 :(得分:2)
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
。