使用 RPATH 构建 OpenSSL?

2023-11-26

我有 Ubuntu 14.04。它附带了 openssl 1.0.1f。我想安装另一个openssl版本(1.0.2)并且我想自己编译它。

我将其配置如下:

LDFLAGS='-Wl,--export-dynamic -L/home/myhome/programs/openssl/i/lib 
-L/home/myhome/programs/zlib/i/lib'

CPPFLAGS='-I/home/myhome/programs/openssl/i/include 
-I/home/myhome/programs/zlib/i/include'

./config --prefix=/home/myhome/programs/openssl/i \
zlib-dynamic shared --with-zlib-lib=/home/myhome/programs/zlib/i/lib \
--with-zlib-include=/home/myhome/programs/zlib/i/include

make 

make install

安装后,当我检查二进制文件时ldd openssl,结果是:

...
libssl.so.1.0.0 => /home/myhome/programs/openssl/i/lib/libssl.so.1.0.0 (0x00007f91138c0000)
libcrypto.so.1.0.0 => /home/myhome/programs/openssl/i/lib/libcrypto.so.1.0.0 (0x00007f9113479000)
...

看起来不错。但是当我检查ldd时libssl.so,结果是:

...
libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fac70930000)
...

它仍然使用系统版本的libcrypto。我尝试了不同的方法 构建,但结果始终保持不变。

我的问题是如何以某种方式配置构建,使其可以对共享库的所有二进制和库依赖项进行硬编码,而无需使用LD_LIBRARY_PATH,或类似的东西。


我的问题是如何以某种方式配置构建,使其可以对共享库的所有二进制和库依赖项进行硬编码,而无需使用LD_LIBRARY_PATH,或类似的东西。

OpenSSL 支持RPATH对于 BSD 目标(但不是其他目标)来说是开箱即用的。从配置:

# Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time
# linkers (tested OpenBSD, NetBSD and FreeBSD) "demand" RPATH set on
# .so objects. Apparently application RPATH is not global and does
# not apply to .so linked with other .so. Problem manifests itself
# when libssl.so fails to load libcrypto.so. One can argue that we
# should engrave this into Makefile.shared rules or into BSD-* config
# lines above. Meanwhile let's try to be cautious and pass -rpath to
# linker only when --prefix is not /usr.
if ($target =~ /^BSD\-/)
    {
    $shared_ldflag.=" -Wl,-rpath,\$(LIBRPATH)" if ($prefix !~ m|^/usr[/]*$|);
    }

对于 OpenSSL 1.0.2 最简单的方法似乎将其添加为CFLAG:

./config -Wl,-rpath=/usr/local/ssl/lib

OpenSSL 1.0.2 的下一个最简单的方法似乎添加配置行并硬编码rpath。例如,我正在 Debian x86_64 上工作。所以我打开了文件Configure在编辑器中,复制linux-x86_64,将其命名为linux-x86_64-rpath,并进行以下更改以添加-rpath option:

"linux-x86_64-rpath",   "gcc:-m64 -DL_ENDIAN -O3 -Wall -Wl,-rpath=/usr/local/ssl/lib::
-D_REENTRANT::-Wl,-rpath=/usr/local/ssl/lib -ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:
${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",

上面,字段 2 和 6 已更改。它们对应于$cflag and $ldflag在 OpenSSL 的构建系统中。

然后,使用新配置进行配置:

$ ./Configure linux-x86_64-rpath shared no-ssl2 no-ssl3 no-comp \
    --openssldir=/usr/local/ssl enable-ec_nistp_64_gcc_128

最后,之后make,验证设置是否卡住:

$ readelf -d ./libssl.so | grep -i rpath
 0x000000000000000f (RPATH)              Library rpath: [/usr/local/ssl/lib]
$ readelf -d ./libcrypto.so | grep -i rpath
 0x000000000000000f (RPATH)              Library rpath: [/usr/local/ssl/lib]
$ readelf -d ./apps/openssl | grep -i rpath 
 0x000000000000000f (RPATH)              Library rpath: [/usr/local/ssl/lib]

一旦你表演make install, then ldd将产生预期结果:

$ ldd /usr/local/ssl/lib/libssl.so
    linux-vdso.so.1 =>  (0x00007ffceff6c000)
    libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007ff5eff96000)
    ...

$ ldd /usr/local/ssl/bin/openssl 
    linux-vdso.so.1 =>  (0x00007ffc30d3a000)
    libssl.so.1.0.0 => /usr/local/ssl/lib/libssl.so.1.0.0 (0x00007f9e8372e000)
    libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007f9e832c0000)
    ...

OpenSSL 有一个编译安装在其维基上。现在它已被添加到维基百科中:编译安装|使用 RPATH

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 RPATH 构建 OpenSSL? 的相关文章

  • -bash: /usr/bin/virtualenvwrapper.sh: 没有这样的文件或目录

    我无法弄清楚 shell 试图在哪里运行 usr bin virtualenvwrapper sh服务器登录时 我希望 virtualenvwrapper 永久卸载 而不仅仅是从 shell 实例中删除 我以为我卸载了它pip uninst
  • 执行bash脚本时如何显示行号

    我有一个测试脚本 其中有很多命令并将生成大量输出 我使用set x or set v and set e 因此当发生错误时脚本将停止 但我还是很难定位到哪一行执行停止了 从而定位问题所在 有没有一种方法可以在每行执行之前输出脚本的行号 或者
  • 为什么我们可以将 sockaddr 转换为 sockaddr_in

    我明白为什么强制转换很有用sockaddr to sockaddr in 但我不明白这怎么可能 据我所知 它们的大小相同sockaddr in添加了sin zero使其大小相同 我想知道编译器如何知道从哪里获取信息sockaddr in如果
  • Ruby 脚本即服务

    嗯 标题说明了一切 我有一个 ruby 脚本 我想在我的 Linux 机器上作为一项服务 我可以启动和停止 运行 我找到了如何在 Windows 上执行此操作here https stackoverflow com questions 16
  • 当非特权用户运行 C/asm 程序时,会对 Linux 造成什么危害?

    我一直在考虑一种场景 让用户 可以是任何人 可能有恶意 提交在 Linux PC 我们称之为基准节点 上运行的代码 目标是为单线程例程创建一种自动化基准测试环境 假设一个网站向代理发布了一些代码 该代理将此代码交给基准节点 而基准节点仅与代
  • Docker 无法写入使用 -v 挂载的目录,除非它有 777 权限

    我正在使用docker solr https github com makuk66 docker solr使用 docker 生成图像 我需要在其中安装一个目录 这是我使用 v flag 问题是容器需要写入我已安装到其中的目录 但似乎没有权
  • 如何在生产环境中运行 spring boot 可执行 jar?

    Spring Boot 的首选部署方法是通过内部包含 tomcat 的可执行 jar 文件 它是从一个简单的开始java jar myapp jar 现在 我想将该 jar 部署到 EC2 上的 Linux 服务器上 我是否遗漏了某些内容
  • x86-64 Linux 中不再允许使用 32 位绝对地址?

    64 位 Linux 默认使用小内存模型 将所有代码和静态数据置于 2GB 地址限制以下 这确保您可以使用 32 位绝对地址 旧版本的 gcc 对静态数组使用 32 位绝对地址 以便节省相对地址计算的额外指令 然而 这不再有效 如果我尝试在
  • accept() 创建一个新套接字是什么意思?

    我的问题基于以下理解 套接字由 ip port 定义 服务器和客户端都有自己的套接字 Socket连接由五组server ip server port client ip client port protocol定义 套接字描述符是标识套接
  • find 命令的“exec”功能可以在后台启动程序吗?

    我想做这样的事情 find iname Advanced Linux Program exec kpdf 可能的 还有其他类似的方法吗 首先 它不会像你输入的那样工作 因为 shell 会将其解释为 find iname Advanced
  • 汇编语言中的全局_start是什么?

    这是我的汇编级代码 section text global start start mov eax 4 mov ebx 1 mov ecx mesg mov edx size int 0x80 exit mov eax 1 int 0x80
  • Linux环境下串口数据转换为TCP/IP

    我需要从Linux系统的串口获取数据并将其转换为TCP IP发送到服务器 这很难做到吗 我有一些基本的编程经验 但对 Linux 的经验不多 有没有开源应用程序可以做到这一点 在 Linux 中您不需要编写程序来执行此操作 只是pipe h
  • 缺少 /var/lib/mysql/mysql.sock 文件

    我正在尝试访问 mysql 当我运行 mysql 命令时 我得到以下信息 root ip 10 229 65 166 tpdatabase 1 8 0 28356 mysql 错误 2002 HY000 无法连接到 通过socket本地My
  • 输出bash脚本的结果

    例如 如果我选择运行一个 bash 脚本 该脚本将输出 回显 时间 例如CheckDate sh 我如何从 Java 运行它 然后在我的 Java 程序中打印 bash 脚本的结果 日期 试试这个代码 String result null
  • Lion:RVM 安装 rubies 时出现问题 - 与 openssl 相关的问题

    我很绝望 现在两天 天都在摆弄以下问题 但没有解决方案 更新 Lion 后 我想使用最新版本的 rvm 安装额外的 rubies 这是我之后调用捆绑器时发生的情况 Users felix rvm rubies ruby 1 9 2 p290
  • Android Studio无法更新

    我正在运行 Mint 14 Linux 并且在使用 Android Studio 时遇到了一个主要问题 运行更新功能时 所有软件包都会返回 访问被拒绝 状态 我怎样才能解决这个问题 如何授予下载和安装的权限 附加信息 studio sh 正
  • 从 X.509 证书中提取 PEM 公钥

    我已经创建了一个包含公钥 DER 文件的证书 但我现在需要 PEM 格式的公钥用于不同的平台 目的是使用相同的公钥 我使用创建它iOS 中的 RSA 加密并使用 PHP 解密 http jslim net blog 2013 01 05 r
  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux
  • 如何管理错误“OpenSSL v1.1.1 ssl_choose_client_version 不支持的协议”? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 尝试通过以下方式连接到 VPN 时openvpn我收到以下错误openssl Tue Oct 30 11 34 16 2018 WARNI
  • Plink 通过 C# 返回不需要的字符

    通过 C 使用 Plink 时 我在结果前后收到不需要的字符 Command ls l informatica tgtdynamicparams out grep vaulttest grep Sep 1 awk print 9 sort

随机推荐

  • 无法解析的外部符号 _declspec(dllimport)

    我在 Visual Studio 中为我的控制台应用程序创建了一个 DLL 在我的 DLL 中 我有一个名为 Dialog MainMenu 的类 其中有一个 cpp 文件和一个 h 文件 以下错误消息 错误9错误LNK2001 无法解析的
  • runST 与 unsafePerformIO 的实际影响

    我想要类似的东西 f forall m Mutable v PrimState m r gt m gt v r gt v r illegal signature f gs x runST do y lt thaw x foldM g gt
  • 如何在大量数字中插入空格以使其更具可读性?

    我想出了这个 因为 stackoverflow 上提供的其他示例是用 C 编写的 string number fmt ulong n cout lt lt lt lt n lt lt lt lt endl char s 128 sprint
  • MongoDB + Node.js:无法正确插入日期

    我一直在使用节点 mongoskin连接这两个 一切都很好 直到我查询了一些 日期 字段 我认为该字段应该作为 javascript 返回Date目的 但结果的类型是字符串 这对我来说很奇怪而且不方便 插入看起来像这样 var doc da
  • 根据Python列表从yaml文件中检索数据

    我在 ipython 工作 我有一个 Yaml 文件和一个与我的 Yaml 文件相对应的 thomas id 列表 thomas 文件下第三行 下面只是该文件的一小部分 完整的文件可以在这里找到 https github com 108mi
  • 为什么选择 MVVM?它的核心优势是什么? [复制]

    这个问题在这里已经有答案了 为什么在处理 WPF 时我们选择 MVVM 而不是 MVC 或 MVP 使用它我们可以获得什么额外的好处 Edit 说实话 今天我去面试 也被问到了这个问题 我回答像 INotifyPropertyChanged
  • 删除flash 9中的右键菜单

    是否可以使用actionscript 3禁用右键菜单 非常感谢任何帮助 您可以使用 stage showDefaultContextMenu false 隐藏除设置选项之外的所有内容
  • Python urllib2 自动填表并检索结果

    我希望能够在站点上查询运行该脚本的计算机的保修信息 如果需要 它应该能够填写表格 例如惠普服务站点的情况 然后能够检索生成的网页 我已经准备好解析返回的结果 html 我只是遇到了麻烦 需要做什么才能对需要放入字段中的数据进行 POST 然
  • @id 和 @+id 有什么区别?

    我刚刚开始使用android 已经完成了大约5个布局文件 然而 我刚刚意识到我一直在互换使用 id和 id 但我不确定两者之间的确切区别是什么 你需要使用 id当您为视图定义自己的 Id 时 正是来自docs 字符串开头的 at 符号 表示
  • Objective-C 中 nil、NIL 和 null 的区别

    我想知道之间的区别nil NIL and null 我用谷歌搜索了一下 发现了这个 nil gt 指向 Objective C 对象的空指针 NIL gt 指向 Objective C 类的空指针 null gt 指向原始类型的空指针或缺少
  • Spring中如何根据配置创建多个相同类型的bean?

    我正在尝试在 Spring 中创建指定数量的相同类型的 bean 我试过了 Bean name beanList public List
  • Git 列出不存在的遥控器

    我最近在 Git 存储库配置文件中对远程存储库进行了一些更改 我重命名了远程名称 将我的起源更改为另一个远程存储库并重命名我的旧起源 例如 我之前有过这样的 remote origin url blah blah remote future
  • org.hibernate.LazyInitializationException:无法初始化代理 - 无会话

    我有 2 台物理服务器 我的 Web 应用程序由负载均衡器管理它们 我总是得到 org hibernate LazyInitializationException 无法初始化代理 无会话 当其中一台服务器受到攻击而另一台服务器运行顺利且没有
  • 反序列化 JSON,属性名称中包含点

    我正在尝试将属性名称中带有点的 JSON 反序列化为键值格式 我正在使用内置的 ASP NET MVC 模型绑定 它似乎将点解释为对象表示法 而不仅仅是键值对象 有没有办法让它正确反序列化为忽略点的键值 这很重要 因为数据需要以这种格式再次
  • 如何在Angular2中上传文件

    我必须提交表格和图像 我已经尝试过这段代码 通过多种方式 但对我不起作用 有没有人有使用 angular2 上传文件的工作演示 请帮助我 组件 html
  • 根据背景反转油漆颜色

    我正在写一个自定义进度条 我想创建类似的效果 其中 50 文本颜色动态更改为白色 而黑色条向右移动 使用 简单 的解决方案可能吗 我查阅了 PorterDuff ColorFilters xFermodes 似乎没有任何效果 有任何想法吗
  • 如何禁用 Servlet 3.0 扫描和自动加载组件

    我们有一个应用程序不断从我们的第 3 方库加载 ServletContainerInitializer 实例 一个实例是 JerseyServletContainerInitializer 另一个实例是 SpringServletConta
  • 没有任何焦点的按键绑定

    我有一个 WPF 屏幕 有六个按钮 我想将每个与键绑定相关联 它们都是通过 MVVM 驱动的 ICommand 我目前将键绑定绑定到事件而不是实际的按钮
  • 基于 PHP 的 HTML 验证器

    我需要找到一个基于 PHP 的 HTML 如 WC3 Like 验证器 它可以查找无效的 HTML 或 XHTML 我在谷歌上搜索了一下 但很好奇是否有人使用过他们特别喜欢的 我有一个字符串中的 HTML html 我希望能够测试该页面并让
  • 使用 RPATH 构建 OpenSSL?

    我有 Ubuntu 14 04 它附带了 openssl 1 0 1f 我想安装另一个openssl版本 1 0 2 并且我想自己编译它 我将其配置如下 LDFLAGS Wl export dynamic L home myhome pro