使ld忽略/etc/ld.so.conf中的目录

时间:2018-10-15 14:07:32

标签: c++ linux gcc ld

TL,DR:

我是否有一种方法(没有root访问权限),使链接器(由gcc调用)在通过{{1 }}?

详细信息:

我正在尝试(并且失败)在没有root用户访问权限的定制Linux发行版上编译HTCondor。由于各种原因(请参阅下文),我相信我遇到的问题与以下事实有关:在此计算机上安装了两个版本的libssl和两个版本的libcrypto。出于兼容性原因,每个版本的较新版本(1.0.0)位于/etc/ld.so.conf,较旧版本(0.9.8)被保留在ldconfig/usr/lib64包含这两个路径,因此链接器会同时知道这两个路径。

在编译过程中出现错误

/usr/local/lib64

因为某种原因,/etc/ld.so.conf../condor_utils/libcondor_utils_8_7_9.so: undefined reference to `ERR_remove_thread_state' 链接,而libcondor_utils_8_7_9.so在1.0.0中引入。它在源代码中只出现一次:

libcrypto.so.0.9.8

所以预处理程序似乎是根据1.0.0版做出决定的。

This这个问题使我意识到this博客文章,因此我尝试使用以下脚本替代ERR_remove_thread_state

#if OPENSSL_VERSION_NUMBER < 0x10000000L
    ERR_remove_state( 0 );
#elif OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
    ERR_remove_thread_state( 0 );
#endif

不幸的是,这无济于事。

仅此而已,我还尝试在上面的源代码片段中注释前置命令,以强制选择cpp。这导致链接器警告我#!/bin/bash /usr/bin/gcc -Wl,-rpath-link="/usr/lib64",-rpath="/usr/lib64" "$@" 可能与ERR_remove_state发生冲突,并且毫不奇怪地,还会产生另一个“未定义的引用”错误。

编辑:

该问题根本与链接器无关。看我的答案。但是,出于好奇,我将悬而未决,以查看是否有人有原始解决方案的解决方案。

1 个答案:

答案 0 :(得分:0)

@ user463035818和@jww的评论向我指出了解决我特定问题的正确方向,但事实证明这些问题与链接器没有直接关系。

Condor使用cmake作为构建系统,因此显然可以尝试在cmake级别(此处为n00b)解决此问题。在cmake所做的所有事情的最深处,它会找到两个版本的库,并出于某种原因将它们混合在一起。根据主要find_library中的this答案调用具有特定版本的CMakeLists.txt可以解决此问题,尽管这会给我留下肮脏的解决方法的味道。

根据docs,在寻找库时,请让cmake忽略某个目录。不过,我还没有尝试过。