2017-10-30 4 views
1

여러 가지 다양한 C++ 실행 파일과 서로 다른 여러 가지 종속성을 가진 라이브러리로 구성된 제품을 작업하고 있습니다. GCC와 -fsanitize-address을 사용하여이 모든 것을 구축하고 있습니다. 내가 이해할 수있는 것은, 주소 소독자를 라이브러리와 함께 사용하려면 공유 객체 (GCC의 기본 옵션)로 빌드해야합니다. 이 때문에 최상의 옵션은 실행 파일에 대해 주소 소실 시간을 -static-libasan으로 정적으로 작성하고 라이브러리에 대해 dinamically 빌드하는 것이라고 생각했습니다. 그러나, 나는 C++ 실행 파일 중 하나를 구축 할 때 내가 링크 오류를 얻을 때를 수행여러 C++ 바이너리에 대해 주소 살균기를 활성화하는 방법

==10823==Your application is linked against incompatible ASan runtimes 

이 날 주소의 정적 및 동적 버전 살균제 GCC와 혼합 될 수 있다고 생각합니다,하고 나는 오른쪽? GitHub 위생 처리 페이지에서 이에 대한 정보를 찾을 수 없었습니다.

+0

이것은 ASAN과 관련이 없으므로 방금 라이브러리로 설명한 내용을 수행하지 마십시오. 공유 버전 (라이브러리와 실행 파일 또는 나중에 실행 파일) 만 사용하거나 정적 버전 (실행 파일에만 사용) 만 사용하십시오. –

답변

2

TLDR : GCC를 사용하고 기본 실행 파일과 shlib 모두가 삭제 된 경우 특별한 작업을 수행 할 필요가 없습니다. 기본값은 -fsanitize=address입니다. GCC를 사용하고 shlib만이 소독 된 경우 다시 응용 프로그램을 실행할 때 -fsanitize=address을 계속 사용하고 LD_PRELOAD=libasan.so을 내 보냅니다.

이제 몇 가지 설명. 원래 Asan은 Clang에서만 존재했으며, 기본적으로 (여전히 사용하는) -static-libasan을 사용했습니다. GCC에 이식 될 때 GCC 개발자는 공유 런타임이 선호됨을 결정했습니다 (예 : 공유 라이브러리를 하나만 살균하고 기본 실행 파일을 unsanitized로 유지할 수 있으므로 다른 예제는 wiki 참조). 두 방법 모두 바이너리 호환되지 않으므로 응용 프로그램의 일부를 정적 런타임 및 동적 런타임과 연결할 수 없습니다.

대략

  • GCCs -fsanitize=address
  • 도청 할게 이봐 -fsanitize=address는 GCCs -fsanitize=address -static-libasan 동등 (연타의 이등 시민 그래서도 지원하지 않고 -shared-libasan) 도청 할게 이봐 -fsanitize=address -shared-libasan 동등하다 (다시, -static-libasan은 GCC의 2 등 시민은 약간의 문제가 있습니다.)
+0

알았습니다. [이 문제] (https://github.com/google/sanitizers/issues/849#issuecomment-338332581)로 인해 GCC에서 주소 소독 프로그램을 정적으로 컴파일하려고했습니다. – Perennialista

+0

LD_PRELOAD는 필요하지 않아야합니다. -fsanitize = 주소를 지정하면 라이브러리를 만들 때 libasan.so. *를 NEEDED로 추가합니다. –

+1

@MarcGlisse 예. 표준 기호가 라이브러리 목록의 첫 번째 기호가 아니기 때문에이를 가로 채지 않습니다. 또한 다른 중요한 문제가 있음을 모호하게 기억합니다. 현재 Asan은 [LD_PRELOAD가 누락되면 실행을 중단합니다] (https://github.com/gcc-mirror/gcc/blob/36093749ff955d9e8cf208b04724c3a1a2ac9b04/libsanitizer/asan/asan_linux.cC# L137). – yugr