FreeBSD에서 AddressSanitizer 지원 활성화

FreeBSD에서 AddressSanitizer 지원 활성화

문제는 본질적으로 FreeBSD에서 AddressSanitizer를 사용하는 프로그램을 컴파일하는 방법입니다.

저는 FreeBSD 10.0(64비트)을 사용하고 있습니다. 플래그를 사용하여 다음 코드를 컴파일하려고 합니다 -fsanitize=address.

int main() {
  return 0;
}

clangas 를 사용하여 컴파일 하면 clang -fsanitize=address file.c다음과 같은 오류 메시지가 나타납니다.

/tmp/t-tEh7oh.o: In function `main`:
file.c:(.text+0xc4): undefined reference to `__asan_report_store4`
/tmp/t-tEh7oh.o: In function `asan.module_ctor`:
file.c:(.text+0x119): undefined reference to `__asan_init_v3`
clang: error: linker command failed with exit code 1 (use -v to see invocation)

gcc48as 를 사용하여 컴파일 하면 gcc48 -fsanitize=address file.c다음과 같은 오류 메시지가 나타납니다.

/usr/local/bin/ld: cannot find -lasan
collect2: error: ld returned 1 exit status

libasan.*내 GNU/Linux 시스템의 파일 시스템 어딘가에 파일이 있습니다. 하지만 FreeBSD에서는 찾을 수 없습니다 . /usr/ports.pkg

어떻게 하면 더 잘 작동하게 해야 할까요?

고쳐 쓰다.gcc48 -v의견에 대한 응답으로 출력 (보다 정확하게는 출력 gcc48 -fsanitize=address file.c -v) 을 추가했습니다 .

Using built-in specs.
COLLECT_GCC=gcc48
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/lto-wrapper
Target: x86_64-portbld-freebsd10.0
Configured with: ./../gcc-4.8.3/configure --disable-bootstrap --disable-nls --enable-gnu-indirect-function --libdir=/usr/local/lib/gcc48 --libexecdir=/usr/local/libexec/gcc48 --program-suffix=48 --with-as=/usr/local/bin/as --with-gmp=/usr/local --with-gxx-include-dir=/usr/local/lib/gcc48/include/c++/ --with-ld=/usr/local/bin/ld --with-pkgversion='FreeBSD Ports Collection' --with-system-zlib --with-ecj-jar=/usr/local/share/java/ecj-4.5.jar --enable-languages=c,c++,objc,fortran,java --prefix=/usr/local --mandir=/usr/local/man --infodir=/usr/local/info/gcc48 --build=x86_64-portbld-freebsd10.0
Thread model: posix
gcc version 4.8.3 (FreeBSD Ports Collection) 
COLLECT_GCC_OPTIONS='-fsanitize=address' '-v' '-mtune=generic' '-march=x86-64'
 /usr/local/libexec/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/cc1 -quiet -v file.c -quiet -dumpbase file.c -mtune=generic -march=x86-64 -auxbase t -version -fsanitize=address -o /tmp//ccjvAeJG.s
GNU C (FreeBSD Ports Collection) version 4.8.3 (x86_64-portbld-freebsd10.0)
    compiled by GNU C version 4.2.1 Compatible FreeBSD Clang 3.3 (tags/RELEASE_33/final 183502), GMP version 5.1.3, MPFR version 3.1.2, MPC version 1.0.2
GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=128184
ignoring nonexistent directory "/usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/../../../../../x86_64-portbld-freebsd10.0/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/include
 /usr/local/include
 /usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/include-fixed
 /usr/include
End of search list.
GNU C (FreeBSD Ports Collection) version 4.8.3 (x86_64-portbld-freebsd10.0)
    compiled by GNU C version 4.2.1 Compatible FreeBSD Clang 3.3 (tags/RELEASE_33/final 183502), GMP version 5.1.3, MPFR version 3.1.2, MPC version 1.0.2
GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=128184
Compiler executable checksum: 6bc4873e12afab16db5dd7bf12b3232f
COLLECT_GCC_OPTIONS='-fsanitize=address' '-v' '-mtune=generic' '-march=x86-64'
 /usr/local/bin/as -v -o /tmp//ccBydWt7.o /tmp//ccjvAeJG.s
GNU assembler version 2.24 (x86_64-portbld-freebsd10.0) using BFD version (GNU Binutils) 2.24
COMPILER_PATH=/usr/local/libexec/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/:/usr/local/libexec/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/:/usr/local/libexec/gcc48/gcc/x86_64-portbld-freebsd10.0/:/usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/:/usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/:/usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/../../../../../x86_64-portbld-freebsd10.0/bin/
LIBRARY_PATH=/usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/:/usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/../../../../../x86_64-portbld-freebsd10.0/lib/:/usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-fsanitize=address' '-v' '-mtune=generic' '-march=x86-64'
 /usr/local/libexec/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/collect2 --eh-frame-hdr -V -dynamic-linker /libexec/ld-elf.so.1 /usr/lib/crt1.o /usr/lib/crti.o /usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/crtbegin.o -L/usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3 -L/usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/../../../../../x86_64-portbld-freebsd10.0/lib -L/usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/../../.. /tmp//ccBydWt7.o -lasan -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/local/lib/gcc48/gcc/x86_64-portbld-freebsd10.0/4.8.3/crtend.o /usr/lib/crtn.o
GNU ld (GNU Binutils) 2.24
  Supported emulations:
   elf_x86_64_fbsd
   elf_i386_fbsd
   elf_x86_64
   elf_i386
   elf_l1om
   elf_l1om_fbsd
   elf_k1om
   elf_k1om_fbsd/usr/local/bin/ld: cannot find -lasan
collect2: error: ld returned 1 exit status

답변1

llvm37포트에서 사용해 보세요 . 기본적으로 AMD64에 소독제를 구축합니다.

관련 정보