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

时间:2017-03-14 22:43:38

标签: 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/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)

任何帮助表示赞赏!

卡斯帕

1 个答案:

答案 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,所以你可以查看长篇解释。