Для начала стал ковырять zlib. Доковырялся до следующего:
Shell
Код: Выделить всё
% CC='clang' CFLAGS='-flto -emit-llvm -O4 -Wl,--plugin=LLVMgold.so' AR=llvm-ar-3.0 ./configure --static
Building static library libz.a version 1.2.8 with clang.
Checking for off64_t... Yes.
Checking for fseeko... Yes.
Checking for strerror... Yes.
Checking for unistd.h... Yes.
Checking for stdarg.h... Yes.
Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf().
Checking for vsnprintf() in stdio.h... Yes.
Checking for return value of vsnprintf()... Yes.
Checking for attribute(visibility) support... No.
% make
... тут всё нормально ...
llvm-ar-3.0 rc libz.a adler32.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o zutil.o compress.o uncompr.o gzclose.o gzlib.o gzread.o gzwrite.o
clang -flto -emit-llvm -O4 -Wl,--plugin=LLVMgold.so -D_LARGEFILE64_SOURCE=1 -o example example.o -L. libz.a
/usr/bin/ld.gold.real: error: libz.a: no archive symbol table (run ranlib)
... и ещё куча ошибок ...
Слинковать этот файл удалось следующим образом: llvm-ld -o example example.o -L. libz.a
Но. Во-первых, из последних версий убрали llvm-ld. Вопрос: как добиться аналогичного результата без него? По крайней мере в используемой мной версии 3.0 llvm-link не умеет работать с архивами (хотя в мане и написано, что якобы умеет).
И во-вторых, всё это здорово, но хотелось бы с минимальными затратами труда собирать готовый код, а как это сделать, если в мейкфайле прописано что-то вроде
Код: Выделить всё
example$(EXE): example.o $(STATICLIB)
$(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS)
Каким-то образом можно сказать clang, чтобы он слинковал всё в биткод, без явного вызова llvm-ld или llvm-link?