EDIT: Nếu TLDR của nó, chỉ cần bỏ qua xuống dưới cùng. Nơi tôi yêu cầu: Làm cách nào để định cấu hình dự án tự động phát để sử dụng thư viện tĩnh?Định cấu hình dự án autotools với Clang khử trùng trong cấu hình lib tĩnh?
Tôi đang làm việc với một vài thư viện nguồn mở và tôi đang cố gắng chạy bộ thử nghiệm của mình dưới các chất vệ sinh của Clang. Để chạy dưới Clit khử trùng, chúng ta cần phải (1) xác định một số tùy chọn, và (2) liên kết các thư viện tĩnh từ Clang's Compiler-RT theo yêu cầu. Lưu ý: không có thư viện động hoặc đối tượng được chia sẻ.
Thiết lập tùy chọn là dễ dàng:
export DYLD_FALLBACK_LIBRARY_PATH=/usr/local/lib/clang/3.3/lib/darwin/
export CC=/usr/local/bin/clang
export CXX=/usr/local/bin/clang++
export CFLAGS="-g3 -fsanitize=address -fsanitize=undefined"
export CXXFLAGS="-g3 -fsanitize=address -fsanitize=undefined -fno-sanitize=vptr"
./configure
Tuy nhiên, điều này sẽ tạo ra một số cảnh báo lưu trữ (khi AR
đang chạy) và các lỗi liên kết (khi LD
đang chạy) với các biểu tượng không xác định. Tin nhắn sẽ tương tự như:
libjpeg.a(jmemmgr.o): In function `do_sarray_io':
/home/jwalton/jpeg-6b/jmemmgr.c:695: undefined reference to
`__ubsan_handle_type_mismatch'
/home/jwalton/jpeg-6b/jmemmgr.c:695: undefined reference to
`__ubsan_handle_type_mismatch'
/home/jwalton/jpeg-6b/jmemmgr.c:696: undefined reference to
`__ubsan_handle_type_mismatch'
Tôi biết các thư viện cần được liên kết. Đối với các chất vệ sinh mà tôi sử dụng, chúng là libclang_rt.asan_osx.a
và libclang_rt.ubsan_osx.a
(hoặc libclang_rt.full-x86_64.a
và libclang_rt.ubsan-x86_64.a
trên Linux).
Để cung cấp thư viện, tôi sau đó xuất các mục sau. Lưu ý: là LIBS
và không phải là LDLIBS
như mong đợi bởi hầu hết các công cụ có liên quan khác make
.
export LIBS="/usr/local/lib/clang/3.3/lib/darwin/libclang_rt.asan_osx.a \
/usr/local/lib/clang/3.3/lib/darwin/libclang_rt.ubsan_osx.a"
Điều này dẫn đến một vấn đề configure
của:
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
...
Nhìn vào config.log
, nó trông giống như hai vấn đề đang xảy ra. Đầu tiên, đường dẫn đang bị tàn sát bằng cách thay đổi từ /usr/local/...
thành /Users/jwalton/...
.Và thứ hai, tên tập tin đang được chặt ra từng khúc bằng cách thay đổi từ một lib tĩnh để một lib động:
configure:3346: ./conftest
dyld: Library not loaded: /Users/jwalton/clang-llvm/llvm-3.3.src/Release+Asserts/lib/clang/3.3/lib/darwin/libclang_rt.asan_osx_dynamic.dylib
Referenced from: /Users/jwalton/libpng-1.6.7/./conftest
Reason: image not found
Trong nỗ lực khác, tôi đã cố gắng sử dụng LDFLAGS
:
export LDFLAGS="-L/usr/local/lib/clang/3.3/lib/darwin/"
export LIBS="libclang_rt.asan_osx.a libclang_rt.ubsan_osx.a"
Điều đó dẫn tới một lỗi tương tự:
configure: error: in `/Users/jwalton/libpng-1.6.7':
configure: error: C compiler cannot create executables
Và config.log
:
configure:3209: /usr/local/bin/clang -g3 -fsanitize=address -fsanitize=undefined -L/usr/local/lib/clang/3.3/lib/darwin/ conftest.c libclang_rt.asan_osx.a libclang_rt.ubsan_osx.a >&5
clang: error: no such file or directory: 'libclang_rt.asan_osx.a'
clang: error: no such file or directory: 'libclang_rt.ubsan_osx.a'
Và thả lib
tiền tố và .a
hậu tố từ LIBS
kết quả trong:
configure:3209: /usr/local/bin/clang -g3 -fsanitize=address -fsanitize=undefined -L/usr/local/lib/clang/3.3/lib/darwin/ conftest.c clang_rt.asan_osx clang_rt.ubsan_osx >&5
clang: error: no such file or directory: 'clang_rt.asan_osx'
clang: error: no such file or directory: 'clang_rt.ubsan_osx'
Và thêm -l
để LIBS
kết quả trong:
configure:3335: /usr/local/bin/clang -o conftest -g3 -fsanitize=address -fsanitize=undefined
-L/usr/local/lib/clang/3.3/lib/darwin/ conftest.c -lclang_rt.asan_osx -lclang_rt.ubsan_osx >&5
configure:3339: $? = 0
configure:3346: ./conftest
dyld: could not load inserted library: /Users/jwalton/libpng-1.6.7/./conftest
./configure: line 3348: 38224 Trace/BPT trap: 5 ./conftest$ac_cv_exeext
Cuối cùng, lập luận -L
là hợp lệ:
$ ls /usr/local/lib/clang/3.3/lib/darwin/
libclang_rt.10.4.a libclang_rt.ios.a
libclang_rt.asan_osx.a libclang_rt.osx.a
libclang_rt.asan_osx_dynamic.dylib libclang_rt.profile_ios.a
libclang_rt.cc_kext.a libclang_rt.profile_osx.a
libclang_rt.cc_kext_ios5.a libclang_rt.ubsan_osx.a
libclang_rt.eprintf.a
Sau tất cả nền: làm cách nào để định cấu hình dự án autotools để sử dụng thư viện tĩnh?
Điểm thưởng: tại sao có điều gì đó trở nên dễ dàng như vậy?
Ah, hoàn hảo. Cảm ơn nhiều. Tôi sẽ không thực hiện những thay đổi đó, nhưng nó cho thấy rõ ràng một vấn đề của Autotools và giải pháp cho các chất khử trùng. Có lẽ họ cũng nên kiểm tra "no sanitzer". Ví dụ: tôi sử dụng thông tin sau cho 'CXXFLAGS':' -fsanitize = undefined -fno-sanitize = vptr'. – jww
Nếu bạn sử dụng MacPorts, bạn chỉ có thể cài đặt cổng libtool. Nó đã có bản vá. Bạn sẽ cần chạy lại 'autoreconf' hoặc' glibtoolize' khi thích hợp trong dự án của bạn để nó nhận phiên bản mới hơn, nhưng điều đó sẽ giúp ích. –