테스트를 위해 다수의 rpm 파일의 빌드 구성을 변경해야 합니다. 여기서는 C/C++ 코드에 대해서만 이야기하고 있습니다. 반드시 자동화하고 싶지는 않지만 손으로 할 수도 있습니다.
이번에는 문제를 더 명확하게 하기 위해 구체적인 예를 사용합니다. Perl 호환 정규식 라이브러리 rpm이 있고사양 문서가지다:
%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 도구를 사용하는 것을 선호합니다.
답변1
대부분의 소프트웨어 패키지에 적용되는 가장 일반적인 방법은 사용자 정의 optflags
매크로입니다.
$HOME/.rpmrc
사용자 정의 값을 생성하고 배치 할 수 있습니다 .
운영 체제의 현재 값을 얻으려면 먼저 다음을 실행할 수 있습니다.
rpm --eval %{optflags}
예를 들어 RHEL 8에서는 다음이 생성됩니다.
-O2 -g -pipe -Wall -Werror=안전한 포맷 -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fExceptionions -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
.
위의 명령을 다시 실행하여 수정된 값을 가져와서 모든 작업을 올바르게 수행했는지 확인하세요.