Linux 需要libssl.so.10的应用程序=>/usr/lib64/libssl.so.10

Linux 需要libssl.so.10的应用程序=>/usr/lib64/libssl.so.10,linux,openssl,ld,strace,ldd,Linux,Openssl,Ld,Strace,Ldd,我有一个应用程序,通过执行以下操作: 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中获得openssl库,而不是在/this/is/oth

我有一个应用程序,通过执行以下操作:

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中获得openssl库,而不是在/this/is/other/文件夹中

两个信息:strace在我的exec上给了我(这清楚地表明它试图将libssl.so.10加载到我的文件夹中,但不在那里,并且不应该像我期望的那样链接到libssl.so):

我的执行官的精灵是:

 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)
感谢您的帮助


Kasper

因为当您使用-lssl链接时,链接编辑器(
ld
)会查找
libss.so
,并在输出文件的
.dynamic
部分向该文件声明其自身为的任何对象发出所需的
dtu
标记

该声明来自
libssl.so
(通常是一个符号链接)的
DT\u SONAME
标记,它报告
libssl.so.10

然后,动态加载程序(
ld.so
)将读取
dtu-NEEDED
标记,并查找名为
libsso.so.10
的文件


实际上,我几年前就这样做了,所以您可以查找长格式的解释。

因为当您使用-lssl链接时,链接编辑器(
ld
)会查找
libss.so
,并在输出文件的
.dynamic
部分向该文件声明的内容发出
dtu所需的
标记

该声明来自
libssl.so
(通常是一个符号链接)的
DT\u SONAME
标记,它报告
libssl.so.10

然后,动态加载程序(
ld.so
)将读取
dtu-NEEDED
标记,并查找名为
libsso.so.10
的文件


事实上,我在几年前就知道了,因此您可以查看详细的表单解释。

我们需要查看您的编译和链接命令。OS可能会有所帮助,因为OSX总是链接到动态库(如果有)。如果存在动态库,您必须格外努力才能链接到静态库。我们需要查看您的编译和链接命令。OS可能会有所帮助,因为OSX总是链接到动态库(如果有)。如果存在动态库,则必须格外努力才能链接到静态库。
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.10]
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)