如何在给定的gcc/configure环境中影响RPATH的值?

mfuanj7w  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(202)

我目前面临着以下模糊问题:我正在使用foreign_cc为我的项目在Bazel环境中依赖的库 Package 基于configure/make的构建过程,我需要将RPATH的值设置为固定值。
我设法使用copts参数注入"-Wl,--rpath,SOME_VALUE",这导致ASFLAGSCFLAGSCXXFLAGS被设置在生成的构建脚本中,这似乎是可行的,但是Bazel创建的二进制文件包含一个奇怪的路径组合 * 前缀 * 到我设置的路径:

$ objdump -x bazel-bin/external/path/to/binary | grep PATH
  RPATH                /opt/gcc-12.2.0/lib/../lib64:/long/path/inside/bazel/cache:SOME_VALUE

字符串
尝试在Bazel之外再现这种行为,即获取/提取源代码,使用完全相同的环境变量运行.configure,并运行类似于Bazel使用的构建脚本的make install,结果正好是我需要的RPATH的值

$ objdump -x dest/usr/local/lib/binary  |grep 'R.*PATH'
  RUNPATH              SOME_VALUE


怎么回事?Bazel-Buildscript在获取RPATH的串联值时做了哪些不同的操作?
好吧,我想有一些区别我只是没有想到,但我不知道从哪里开始。是否有一个隐藏的环境变量,我可以设置它说:“前缀的预期值为RPATH与一些值提取的工具链”?
下面是build_script.sh实际构建二进制文件的部分,我也在外部运行了它,但结果不同:

ARFLAGS="rcsD" \
AR_FLAGS="rcsD" \
ASFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer -fno-canonical-system-headers -Wno-builtin-macro-redefined -D__DATE__="redacted" -D__TIMESTAMP__="redacted" -D__TIME__="redacted" -Wl,--rpath,SOME_VALUE" \
CFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer -fno-canonical-system-headers -Wno-builtin-macro-redefined -D__DATE__="redacted" -D__TIMESTAMP__="redacted" -D__TIME__="redacted" -Wl,--rpath,SOME_VALUE" \
CXXFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer -std=c++0x -fno-canonical-system-headers -Wno-builtin-macro-redefined -D__DATE__="redacted" -D__TIMESTAMP__="redacted" -D__TIME__="redacted" -Wl,--rpath,SOME_VALUE" \
LDFLAGS="-fuse-ld=gold -Wl,-no-as-needed -Wl,-z,relro,-z,now -B/usr/bin -pass-exit-codes -lstdc++ -lm -L$EXT_BUILD_DEPS/openssl/lib" \
AR="/usr/bin/ar" \
CC="/usr/bin/gcc" \
CXX="/usr/bin/gcc" \
RANLIB=":" \
CPPFLAGS="-I$EXT_BUILD_DEPS/openssl/include" \
./configure
$EXT_BUILD_ROOT/bazel-out/k8-opt-exec-2B5CBBC6/bin/external/rules_foreign_cc/toolchains/make/bin/make install

qlzsbp2j

qlzsbp2j1#

我将继续并假设您正在使用自动解析工具链(特别是在Linux上)。您正在查看的RPATH位将来自runtime_library_search_directories特性,该特性插入-rpath动态链接二进制文件…以便它们与bazel runbazel test一起工作。
一般来说,对于cc_*规则,工具配置是工具链配置的一个功能(您自己的或自动解析和配置的)。它处理不同的信息片段(用户传递的配置)以及构建派生(例如在结果树中期望solib的位置)以获得完整的调用。通过copts属性添加的标志由user_compile_flags特性处理(如下所示)。“其他”-rpath参数是由runtime_library_search_directories功能基于runtime_library_search_directories变量添加的,该变量将由bazel填充,因为它添加了要链接的solibs。TL;DR有多个信息源(不仅仅是copts),编译器/链接器调用的命令行将从这些信息源中进行组装。
该描述将涉及定义这些特征/使它们与遗留特征修补逻辑一起修补的自动解析工具链或自定义工具链。一个完全(从头开始)自定义的工具链可以以不同的方式处理命令行的构造和工具调用。
除此之外,我对cc_foreign规则没有太多的了解,虽然我理解它们存在的原因,但我通常会尽量避免使用它们(但您的里程可能会因您对树的依赖性和控制而异)。什么让我有点奇怪的表面上,虽然你说它的工作,我不会期望copts和通过CXXFLAGS & Co。由于RPATH在很大程度上是一个链接时间配置,我实际上希望linkopts和“外来”通过LDFLAGS传递它更有意义?

相关问题