c - 从共享库创建可执行文件的命令差异

标签 c gcc shared-libraries

下面创建的 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/

相关文章:

c - 在 GCC 中链接 libssl 和 libcrypto

c - 在不使用 gcc 内联汇编的情况下访问寄存器

java - Android如何添加动态库?

c++ - Buildroot:仅构建一个包作为共享和静态库,所有其他包仅共享

c - struct 的 unsigned int 字段自动初始化了吗?

c - 我使用 malloc(0) 作为指向 char 的指针,并且我的代码有效。这是为什么?

c - 如何从共享库(elf/gcc)中删除未使用的引用

fortran - Fortran共享库中的符号命名,intel vs gcc?

c - 为什么我的程序在提供输入后无法运行?

c - fflush(stdout) 问题;