сборка программ в биткод LLVM

IDE, VCS и прочее

Модератор: Модераторы разделов

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20934
Статус: nulla salus bello
ОС: Debian GNU/Linux

сборка программ в биткод LLVM

Сообщение Bizdelnick »

Что-то хочется странного в последнее время. Например взять какую-нибудь софтину, собрать её в единый файл биткода и в таком виде раскидывать по разным системам, где уже либо запускать через lli, либо компилировать в нативный код. Но что-то пока не очень получается.
Для начала стал ковырять 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?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20934
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: сборка программ в биткод LLVM

Сообщение Bizdelnick »

Если перед ./configure добавить определение RANLIB=/bin/true, то ошибка уже другая:

Shell

% 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: malformed archive header name at 8 ...

Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5355
ОС: Gentoo

Re: сборка программ в биткод LLVM

Сообщение /dev/random »

Bizdelnick писал(а):
20.12.2014 20:35
Что-то хочется странного в последнее время. Например взять какую-нибудь софтину, собрать её в единый файл биткода и в таком виде раскидывать по разным системам, где уже либо запускать через lli, либо компилировать в нативный код. Но что-то пока не очень получается.

Это просто разминка для мозгов или есть какая-то практическая цель? А то ведь если системы идентичны, то можно не заморачиваться и раскидывать готовый нативный бинарник, а если различаются, то неплохо бы учесть, что C после стадии препроцессинга перестаёт быть кроссплатформенным, и соответственно, биткод LLVM кроссплатформенным тоже не будет. В обоих случаях затея лишена смысла.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20934
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: сборка программ в биткод LLVM

Сообщение Bizdelnick »

/dev/random писал(а):
21.12.2014 11:55
Это просто разминка для мозгов или есть какая-то практическая цель?

Пока - разминка.

/dev/random писал(а):
21.12.2014 11:55
C после стадии препроцессинга перестаёт быть кроссплатформенным

Ну архитектуроспецифичный код встречается не так часто, а привязка к ОС меня на данный момент не особо волнует. Допустим, я хочу, чтобы программа работала на GNU/Linux, но как на x86, так и на ARM.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20934
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: сборка программ в биткод LLVM

Сообщение Bizdelnick »

Подниму тему. Встала на сей раз более конкретная задача. Нужно собрать разделяемую библиотеку в биткод LLVM (после чего на целевой платформе преобразовать в нативную). В зависимостях есть ряд библиотек, для простоты ограничимся libc. Она также собрана в биткод, в виде архива libc.a. Затык прежний: надо как-то её слинковать. llvm-ld это умел, а llvm-link не умеет. Можно, конечно, распаковать архив и скормить всё его содержимое llvm-link, но в таком случае он запихает в итоговую библиотеку всё содержимое libc, а не только нужное. Файл получится слишком жирным, а этого хочется избежать. Как сделать то, с чем справлялся llvm-ld, пока его не посчитали ненужным? Гальванизировать llvm-ld затруднительно, в LLVM уже очень многое поменялось.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5355
ОС: Gentoo

Re: сборка программ в биткод LLVM

Сообщение /dev/random »

Bizdelnick писал(а):
16.10.2017 19:28
Подниму тему. Встала на сей раз более конкретная задача. Нужно собрать разделяемую библиотеку в биткод LLVM (после чего на целевой платформе преобразовать в нативную). В зависимостях есть ряд библиотек, для простоты ограничимся libc. Она также собрана в биткод, в виде архива libc.a. Затык прежний: надо как-то её слинковать. llvm-ld это умел, а llvm-link не умеет. Можно, конечно, распаковать архив и скормить всё его содержимое llvm-link, но в таком случае он запихает в итоговую библиотеку всё содержимое libc, а не только нужное. Файл получится слишком жирным, а этого хочется избежать. Как сделать то, с чем справлялся llvm-ld, пока его не посчитали ненужным? Гальванизировать llvm-ld затруднительно, в LLVM уже очень многое поменялось.

Можно попробовать сначала объединить через llvm-link, а потом убрать лишнее через opt.

Bizdelnick писал(а):
21.12.2014 12:59
Ну архитектуроспецифичный код встречается не так часто, а привязка к ОС меня на данный момент не особо волнует. Допустим, я хочу, чтобы программа работала на GNU/Linux, но как на x86, так и на ARM.

На x86[-64] константа O_DIRECTORY (открытие директории) для вызова open() имеет значение 0200000, а O_DIRECT (прямой ввод-вывод) - 040000. На ARM - наоборот. Число вместо имени подставляется на этапе препроцессинга.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20934
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: сборка программ в биткод LLVM

Сообщение Bizdelnick »

/dev/random писал(а):
16.10.2017 19:56
На x86[-64] константа O_DIRECTORY (открытие директории) для вызова open() имеет значение 0200000, а O_DIRECT (прямой ввод-вывод) - 040000. На ARM - наоборот. Число вместо имени подставляется на этапе препроцессинга.

К стоящей сейчас задаче это от ношения не имеет. Достаточно одной архитектуры (нужна переносимость на другие ОС, которая будет обеспечиваться хитрым враппером для libc).

/dev/random писал(а):
16.10.2017 19:56
Можно попробовать сначала объединить через llvm-link, а потом убрать лишнее через opt.

Я об этом думал. Но проблема в том, что собирается библиотека, а не исполняемый файл. Как оптимизатор сможет понять, что можно выкинуть, а что надо оставить?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5355
ОС: Gentoo

Re: сборка программ в биткод LLVM

Сообщение /dev/random »

Bizdelnick писал(а):
16.10.2017 20:32
Я об этом думал. Но проблема в том, что собирается библиотека, а не исполняемый файл. Как оптимизатор сможет понять, что можно выкинуть, а что надо оставить?

Я не проверял, и не знаю, сработает ли это с llvm-link, но можно попробовать: скомпилировать .a-файл с флагом -fvisibility=hidden. Он означает, что находящиеся в .o-файлах функции должны быть видны другим .o-файлам в пределах .so-файла, но не другим .so-файлам.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20934
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: сборка программ в биткод LLVM

Сообщение Bizdelnick »

Оно в любом случае будет собираться с -fvisibility=hidden. Вот только надо изобрести способ, чтобы проверить, действительно ли лишнее выкинулось.
Немного поэкспериментировал с lld, вроде бы получается что-то похожее на то, что надо (линковал clang -flto -fuse-ld=lld-5.0). Завтра продолжу эксперименты.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: