Compiling

如何可靠地修改建構配置並在 C/C++ RPM 文件中添加編譯器標誌?

  • July 7, 2020

出於測試目的,我需要更改大量 rpm 文件的建構配置。我在這裡只說 C/C++ 程式碼。我不一定要進行自動化,但我什至可以手動操作。

這次我將使用一個具體的例子來使問題更清楚。假設我有 Perl Compatible Regular Expressions 庫的 rpm,並且specfile有:

%configure \
%ifarch s390 s390x sparc64 sparcv9 riscv64
   --disable-jit \
%else
   --enable-jit \
%endif
   --enable-pcretest-libreadline \
   --enable-utf \
   --enable-unicode-properties \
   --enable-pcre8 \
   --enable-pcre16 \
   --enable-pcre32 \
   --disable-silent-rules
%{make_build}

我想為 AddressSanitizer 添加編譯器標誌,所以我在後面添加--disable-silent-rules

  CFLAGS="$CFLAGS -fsanitize=address -g3"
  CXXFLAGS="$CXXFLAGS -fsanitize=address -g3" \
  LDFLAGS="$LDFLAGS -fsanitize=address -g3" \
  LSAN_OPTIONS="verbosity=1:log_threads=1:log_pointers=1"
  ASAN_OPTIONS="detect_leaks=0"

這是最好的方法嗎?我發現有時,這不起作用。在這種情況下,我檢查了輸出 .sos 並且它們沒有 asan 部分或-g3調試資訊…在這種情況下,我正在尋找一種可靠的方法來添加 asan 和調試資訊,但這可能適用於任何此類編譯器標誌。我也可以嘗試手動執行此操作,但我更喜歡使用 RPM 工具,以便能夠可靠地重現 RPM 規範文件中指定的確切建構。

適用於大多數包的最通用方法是自定義optflags宏。

您可以為它創造$HOME/.rpmrc並賦予您定制的價值。

要獲取我們作業系統的目前值,您可以首先執行:

rpm --eval %{optflags}

這將產生,例如在 RHEL 8 上:

-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/ redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection

複製粘貼您的結果,同時根據需要修改參數,例如更改-g-g3並將其保存在~/.rpmrc.

通過再次執行上述命令來驗證您是否正確執行了所有操作,以獲取修改後的值。

引用自:https://unix.stackexchange.com/questions/597251