Компиляция Apache httpd в байт-код LLVM с помощью clang

Я хочу скомпилировать httpd в байт-код LLVM, используя clang. Сначала я попытался скомпилировать его с помощью gcc, для чего сделал следующее:

./configure --prefix=/home/varun/apache/httpd/gcc --with-included-apr
make
sudo make install

И он успешно устанавливается!

Теперь я пытаюсь скомпилировать его с помощью clang, для чего я делаю следующее:

CC="clang" CFLAGS="-O4" ./configure --prefix=/home/varun/apache/httpd/clang --with-included-apr
make   # didn't come to this step
sudo make install # didn't come to this step

И сама настройка не проходит. Я выбрал -O4, так как читал, что LLVM выводит байт-код, если вы используете -O4 или -emit-llvm в качестве CFLAGS (ни один из них не работает).

Это ошибка, которую я получаю:

checking whether the C compiler works... no
configure: error: in `/home/varun/apache/httpd/httpd-2.4.3/srclib/apr':
configure: error: C compiler cannot create executables

Связано ли это с тем, что компоновщик не может связать файлы байт-кода LLVM?


person varuaa    schedule 13.12.2012    source источник
comment
Спасибо @Lei Mou за редактирование вопроса. Я должен правильно сформулировать вопрос.   -  person varuaa    schedule 13.12.2012


Ответы (3)


[Я знал, что это что-то связанное с этапом компоновки, но не смог заставить все работать. Наконец компиляция прошла успешно, поэтому я пишу свой собственный ответ]

Подход 1 (неудачный)

  1. Установил clang в моей системе с помощью диспетчера пакетов Synaptic.
  2. Установил binutils-gold, т.к. это необходимо для передачи LLVMgold.so в качестве плагина компоновщику. Но для этого у установленного clang должен быть плагин gold.

Попытка настроить httpd с помощью этой команды:

CC="clang" CFLAGS="-O4" ./configure --prefix=/home/varun/work/httpd/build --with-included-apr

Здесь --with-included-apr требуется httpd. -O4 требуется, чтобы компиляция происходила через байт-код.

Сам этот шаг настройки не удается, потому что установленный clang не имеет надлежащего подключаемого модуля, позволяющего компоновщику связывать объектные файлы байт-кода.

Подход 2 (успех)

  1. Установил binutils-gold. Также получил исходники binutils.
  2. Компиляция LLVM и использование исходного кода binutils для компиляции, чтобы у LLVM был золотой плагин.

Скомпилировать LLVM,

../configure --with-binutils-include=/usr/src/binutils/binutils-2.22/include --enable-gold --prefix=/usr/local
make
sudo make install

ln -s /usr/local/lib/LLVMgold.so /usr/lib/bdf-plugins/LLVMgold.so

Теперь скомпилируйте httpd.

CC="clang" CFLAGS="-O4" ./configure --prefix=/home/varun/work/httpd/build --with-included-apr
make
sudo make install
person varuaa    schedule 13.12.2012

Байт-код LLVM — это промежуточное представление, используемое в LLVM. Он не может быть выполнен ни на одной машине. Вот почему скрипт configure жалуется, что

C compiler cannot create executables.

Не выводить байт-код LLVM. Вместо этого попробуйте использовать другой уровень оптимизации. (и не используйте -emit-llvm в CFLAGS).

person Lei Mou    schedule 13.12.2012
comment
@varuaa Попробуйте это. Укажите CC=clang при выполнении configure, затем введите CFLAGS=-O4 make. На этапе компоновки может возникнуть ошибка компоновки, поскольку компоновщик GNU ld ничего не знает о байт-коде LLVM, тогда попробуйте указать LD=llvm-ld при выполнении скрипта configure. - person Lei Mou; 13.12.2012

Я ответил на очень похожий вопрос здесь:

https://stackoverflow.com/questions/30401450/generate-llvm-ir-for-httpd?rq=1

На самом деле легко построить IR для большинства хорошо написанных проектов.

Бессовестная заглушка для нашего инструмента:

https://github.com/SRI-CSL/whole-program-llvm

Удачи.

person Ian A. Mason    schedule 26.07.2016