我有一个应用程序:
export LD_LIBRARY_PATH=/this/is/another/folder
ldd myApp
// ...
libssl.so.10 => /usr/lib64/libssl.so.10
// ...
第一个问题:为什么myApp在libssl.so.10上显式链接?当我在openssl文件夹中时(不应该与libssl.so链接?):
/usr/lib64/libssl3.so
/usr/lib64/libssl.so -> libssl.so.1.0.1e
/usr/lib64/libssl.so.10 -> libssl.so.1.0.1e
/usr/lib64/libssl.so.1.0.1e
第二个问题:为什么它会在/ usr / lib64中出现openssl lib而不是/ this /是/ another / folder中的那个?
我的执行官给了我两个信息: strace (这清楚地说它试图在我的文件夹中加载libssl.so.10但不在那里它不应该像我一样期望与libssl.so联系:
open("/this/is/another/folder/libssl.so.10", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib64/libssl.so.10", O_RDONLY) = 3
我的执行官的精灵是:
0x0000000000000001 (NEEDED) Shared library: [libssl.so.10]
更新 主要的makefile部分:
SRC = myApp.cpp
TARGET = myApp
INCLUDE = -I/my/open/ssl/path/include
LINK = -L/my/open/ssl/path/libs -lssl -lcrypto
CFLAGS = -MMD -MP -c -std=c++0x
all: $(TARGET)
$(TARGET): $(SRC)
$(CXX) -o $(TARGET) $(SRC) $(LINK)
任何帮助表示赞赏!
卡斯帕
答案 0 :(得分:0)
因为当您与-lssl链接时,链接编辑器(ld
)会查找libss.so
,并在{{1}中发出DT_NEEDED
标记输出文件的部分,无论该文件声明自己是什么。
该声明来自.dynamic
DT_SONAME
部分的.dynamic
标记(通常是符号链接),并报告libssl.so
。
动态加载程序(libssl.so.10
)将会读取ld.so
标记,并查找名为DT_NEEDED
的文件。
几年前我实际上是wrote about this,所以你可以查看长篇解释。