标签: rpath

如何使用相对rpath编译OpenSSL

我一直在尝试使用以下rpath编译openssl 1.0.0g:

$ORIGIN/../lib64
Run Code Online (Sandbox Code Playgroud)

每次我readelf -d apps/openssl,我得到的结果如下,取决于我尝试的逃避变化:

\RIGIN/../lib64
RIGIN/../lib64
ORIGIN/../lib64
Run Code Online (Sandbox Code Playgroud)

我想在不使用像chrpath这样的外部工具的情况下设置我的rpath.它可能吗?我基本上会接受任何不涉及使用像chrpath这样的外部工具的东西(虽然我已经完成了).

理想情况下,我想通过在命令行(任何形式-Wl,-rpath,$ORIGIN/../lib64)上传递选项来实现.

我不介意编辑生成的Makefile,这是我最后一次尝试的.如果我能打印出一个愚蠢的美元符号!我尝试在BUILDENV =块下修改LIBRPATH而没有运气.到目前为止我的最好成绩:

LIBRPATH=$$'ORIGIN/../lib64 # result: /../lib64
LIBRPATH=$$$$'ORIGIN/../lib64 # result: 12345<pid>/../lib64 
Run Code Online (Sandbox Code Playgroud)

我已经阅读了各种与rpath相关的问题,并尝试了各种转义和引用技巧但到目前为止没有任何工作!

openssl makefile rpath

8
推荐指数
2
解决办法
3916
查看次数

如何使用$ ORIGIN和suid应用程序?

我正在使用python并启用了setcap CAP_NET_RAW.我的python脚本导入一个共享库,其RPATH中有$ ORIGIN.由于我的python现在是一个suid应用程序,因此不评估$ ORIGIN并且库未正确加载(这是由于glibc中发现的安全漏洞).有没有办法告诉链接器我的库路径是安全的并且还加载了库?

还有一些说明:

  1. 我只需要在开发阶段使用此功能.我不是在寻找生产解决方案.
  2. 当以root身份工作时,一切正常.
  3. 我不想以root身份工作.

谢谢,戴夫

linux rpath shared-libraries ld suid

7
推荐指数
1
解决办法
1179
查看次数

未加载库:Prophet / Python 中的 @rpath/libtbb.dylib

我使用的是 Mac X1,蒙特雷。

我已经安装了 Prophet,并在尝试拟合模型时遇到了这个问题。

RuntimeError: Error during optimization: console log output:

dyld[90668]: Library not loaded: @rpath/libtbb.dylib

Referenced from: /Users/{username}/opt/anaconda3/lib/python3.9/site-packages/prophet/stan_model/prophet_model.bin
  Reason: tried: '/private/var/folders/cd/dfrqgp4s4ll55cwb7rtgccbw0000gq/T/pip-install-rjpuj450/prophet_d7e4cce10e414c89a572fe3605ae9269/build/lib.macosx-11.1-arm64-cpython-39/prophet/stan_model/cmdstan-2.26.1/stan/lib/stan_math/lib/tbb/libtbb.dylib' (no such file), '/private/var/folders/cd/dfrqgp4s4ll55cwb7rtgccbw0000gq/T/pip-install-rjpuj450/prophet_d7e4cce10e414c89a572fe3605ae9269/build/lib.macosx-11.1-arm64-cpython-39/prophet/stan_model/cmdstan-2.26.1/stan/lib/stan_math/lib/tbb/libtbb.dylib' (no such file), '/usr/local/lib/libtbb.dylib' (no such file), '/usr/lib/libtbb.dylib' (no such file)
Run Code Online (Sandbox Code Playgroud)

我知道这与搜索错误的路径有关。我可以在以下位置找到 dylib

/Users/{user}/opt/anaconda3/lib/python3.9/site-packages/prophet/stan_model/cmdstan-2.26.1/stan/lib/stan_math/lib/tbb/
Run Code Online (Sandbox Code Playgroud)

但是,先知似乎不知道去看那里。我很好奇如何更新/修复 rpath 变量或找到另一个解决方案?

我尝试使用 sudo ln -s 创建符号链接,但没有笔记本电脑上的权限。

蒂亚!

rpath stan facebook-prophet

7
推荐指数
2
解决办法
8990
查看次数

在OSX上可靠地部署Delphi生成的Dylib

我想在OSX上部署一个.dylib,它是用Delphi创建的.此.dylib应该可以由第三方应用程序加载.

这似乎是一个重复的问题,但经过大量的搜索,我找不到答案.问题与此相同:https://forums.embarcadero.com/thread.jspa?messageID = 592417

问题是.dylib需要libcgunwind.1.0.dylib,但是从第三方应用程序运行时它找不到它.作为测试,我试图复制libcgunwind.1.0.dylib到usr/lib,而且工作.当OSX无法找到.dylib时,它将始终搜索usr/lib.不幸的是,我不想将此作为最终解决方案,因为它需要提升权限,而且似乎是一种处理简单问题的繁琐方式.


仔细检查一下,我曾经otool检查过我的.dylib,它给了我以下路径:@rpath/libcgunwind.1.0.dylib.

问题是,@rpath当您的.dylib由第三方应用程序运行时,无法说明将列出哪些路径.为此,应用程序始终必须提供绝对路径libcgunwind.1.0.dylib.

显而易见的解决方案是使用install_name_tool来代替@rpath用@loader_path.如果我的逻辑是正确的,这应该导致我的.dylib总是找到libcgunwind.1.0.dylib,只要它们在同一个文件夹中.这是有道理的,因为.dylib应该负责找到自己的依赖项.

所以,我尝试了以下命令行:

install_name_tool -change @rpath/libcgunwind.1.0.dylib @loader_path/libcgunwind.1.0.dylib libTest.dylib

并收到此消息:

install_name_tool: file not in an order that can be processed (local relocation entries out of place): libTest.dylib

我做了一些搜索此错误消息,我一直无法找到任何信息.我必须假设install_name_tool期望在gcc或llvm中构建.dylib中找到一些特定约定,并且Delphi的编译器不提供这些约定.

我在Delphi的编译器中dccosx进行了一些挖掘,并检查了Delphi发送给它的命令行参数,但是我找不到任何有用的选项.这种使用方式libcgunwind.1.0.dylib似乎是编译器隐含的,而不是我可以调整的东西.

我并不是说这是解决问题的正确方法,这些只是我尝试过的最新事情.如果您能想出一个解决问题的不同方法,请分享您的想法!

delphi deployment macos rpath dylib

6
推荐指数
1
解决办法
846
查看次数

rpath在库中的传播失败

简短问题:LC_RPATH库中命令的rpath是否传递到后续(和间接)动态加载的库中?

更确切地说:我已libapi.dylib动态链接到libloader.dylib动态加载插件libplugin.dylib.我有:

$ otool -l lib/libapi.dylib
lib/libapi.dylib
        libapi.dylib
        /usr/lib/libSystem.B.dylib
        @rpath/libloader.dylib

$ otool -l lib/libloader.dylib
lib/libloader.dylib
        libloader.dylib
        /usr/lib/libSystem.B.dylib

$ otool -l lib/plugins/libplugin.dylib
lib/plugins/libplugin.dylib:
        libplugin.dylib
        /usr/lib/libSystem.B.dylib
        @rpath/libloader.dylib

$ otool -L lib/libapi.dylib | grep "LC_RPATH" -A2
        cmd LC_RPATH
      cmdsize 32
        path @loader_path/ (offset 12)
Run Code Online (Sandbox Code Playgroud)

既不定义rpath命令libloader.dylib也不libplugin.dylib定义.并且安装名称没有任何@ rpath /或其他路径,尽管load命令中的名称前缀为@rpath /.

客户端现在加载libapi.dylib哪个链接到哪个libloader.dylib.此库动态加载libplugin.dylib链接到的库libloader.dylib.

为什么不能libplugin.dylib加载?它退出,因为它找不到libloader.dylib- 虽然它必须已经加载.为什么rpath @ loader_path/libapi.dylib没有正确地传播libloader.dylib到libplugin.dylib …

macos mach-o rpath dyld

6
推荐指数
0
解决办法
427
查看次数

使用 RPATH 构建 OpenSSL?

我有 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
Run Code Online (Sandbox Code Playgroud)

安装后,当我用 检查二进制文件时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)
...
Run Code Online (Sandbox Code Playgroud)

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

...
libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fac70930000)
...
Run Code Online (Sandbox Code Playgroud)

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

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

linux openssl rpath ldd

6
推荐指数
1
解决办法
8189
查看次数

pkg-config:设置-rpath 的最佳实践?

是否有基于输出设置-rpath或 libtool 的最佳实践?我必须诉诸技巧吗?-Rpkg-configsed

c c++ pkg-config rpath library-path

6
推荐指数
1
解决办法
771
查看次数

如何在OS X上更改RPATH

我正在从openkinect的网站上进行简单的安装,以使用xbox kinect.问题是没有OSX发行版,并假设自制软件将为您安排.

在安装的最后一步,我找到了一个有用的线索,说明我的安装有什么问题.

我被网站告知."如果链接有问题,则必须使用以下命令更改每个libfreenect lib的rpath:"

for i in /opt/local/lib/libfreenect*.dylib; do sudo install_name_tool -id $i $i; done
sudo install_name_tool -change libfreenect.0.2.dylib /opt/local/lib/libfreenect.0.2.dylib /opt/local/lib/libfreenect_sync.dylib
sudo install_name_tool -change libfreenect.0.2.dylib /opt/local/lib/libfreenect.0.2.dylib /opt/local/lib/libfreenect_cv.dylib
sudo install_name_tool -change libfreenect_sync.0.2.dylib /opt/local/lib/libfreenect_sync.0.2.dylib /opt/local/lib/libfreenect_cv.dylib
for i in glview regview hiview glpclview tiltdemo record cppview cvdemo; do sudo install_name_tool -change libfreenect.0.2.dylib /opt/local/lib/libfreenect.0.2.dylib /opt/local/bin/$i; sudo install_name_tool -change libfreenect_sync.0.2.dylib /opt/local/lib/libfreenect_sync.0.2.dylib /opt/local/bin/$i; done
Run Code Online (Sandbox Code Playgroud)

我的rpath肯定设置不正确.当用CMake构建时,这个次要消息肯定证实了我的怀疑.

CMake Warning (dev):
  Policy CMP0042 is not set: MACOSX_RPATH is enabled by default.  Run "cmake
  --help-policy CMP0042" for policy …
Run Code Online (Sandbox Code Playgroud)

macos path rpath cmake openkinect

6
推荐指数
1
解决办法
3356
查看次数

CMake、OSX、@rpath 和链接到框架

我花了一个星期试图让我在 Linux 上工作的东西在 OSX 上工作,但无济于事。我试过阅读关于 rpath 的 CMake 文章和其他各种关于它的 SO 帖子,并尝试使用我的 CMakeLists.txt 来让它工作,但我失败了,我希望有人能给我一些提示我做错了什么。

# CMake 2.8.11 and above required for linking to qtmain.lib library on Windows
# CMake 2.8.12 and above required for MACOSX_RPATH property
cmake_minimum_required(VERSION 2.8.12)
set(PROJECT_NAME "maya_standalone_test")

if(APPLE)
    message(STATUS "Setting MacOSX SDK...")
    set(CMAKE_OSX_SYSROOT "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk")
endif(APPLE)

project(${PROJECT_NAME})

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/modules)

# Attempt to find existing installation of Maya and define variables
find_package(Maya REQUIRED)

# Add include search paths
include_directories(
  ${MAYA_INCLUDE_DIR}
  ${PROJECT_SOURCE_DIR}/include
)

if(APPLE)
    message(STATUS "Setting OSX Framework path to: ${MAYA_LOCATION}/Maya.app/Contents/Frameworks") …
Run Code Online (Sandbox Code Playgroud)

macos frameworks rpath cmake hyperlink

6
推荐指数
0
解决办法
1148
查看次数

CMake、RPATH、$ORIGIN 和 @loader_path

在我的 CMake 项目中,我构建了一堆在运行时作为插件加载的库。因此,我需要设置各种 RPATH,以便动态加载机制可以找到这些库。我还需要整个东西都是可重定位的,因为它是 Python 扩展模块的一部分,因此在构建过程中会被各种工具复制。

似乎正确的方法是使用$ORIGINLinux 上的特殊变量以相对方式设置 RPATH ,并且@loader_pathOSX。好吧,那很好。但是翻看

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling

似乎我必须手动执行此操作?CMake 没有任何内置变量,如${ORIGIN}或根据操作系统扩展为正确事物的东西?(也许它甚至因链接器或其他东西而异?我不知道)。似乎这是 CMake 应该为我解决的事情,所以我想在尝试自己实现切换之前检查我没有遗漏任何东西......

顺便说一句,我不关心 Windows,所以如果有一些解决方案不适用于 Windows,这并不重要:)。

linux macos rpath cmake

6
推荐指数
0
解决办法
2368
查看次数