Skip to content

Instantly share code, notes, and snippets.

@tonosaman
Last active October 22, 2016 08:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tonosaman/30c90bab5c33b92f9703f05f3d127484 to your computer and use it in GitHub Desktop.
Save tonosaman/30c90bab5c33b92f9703f05f3d127484 to your computer and use it in GitHub Desktop.
NetBSD7.0.1 で LLVM-3.9 をビルドしたい人の備忘録(1)

NetBSD7.0でLLVM-3.9をビルドしたい人の備忘録(1)

  • クロス開発環境はNetBSDが好き(個人的な意見です)
  • NetBSDは自前のビルドシステム上で LLVM-3.6 をビルドするMakefileが用意されている(古い)
    • LLVMがCMake使うようになってメンテが大変なのかしら?
  • FreeBSDはカーネルもLLVMでビルドしてるだけあって、LLVM-3.8をサポート(いいなー)
  • yacto とか crochet もいいんだけど、今回は見送り

動的リンク時にて$ORIGINが参照されないようにする

*** dist/llvm/CMakeLists.txt.org        2016-10-21 17:36:00.682109043 +0900
--- dist/llvm/CMakeLists.txt    2016-10-21 17:35:18.761512845 +0900
*************** if (APPLE)
*** 623,629 ****
  else(UNIX)
    if(NOT DEFINED CMAKE_INSTALL_RPATH)
      set(CMAKE_INSTALL_RPATH "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}")
!     if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,origin")
        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,origin")
      endif()
--- 623,629 ----
  else(UNIX)
    if(NOT DEFINED CMAKE_INSTALL_RPATH)
      set(CMAKE_INSTALL_RPATH "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}")
!     if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly|NetBSD)")
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,origin")
        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,origin")
      endif()

ついでにNetBSD のリンカ ld.elf_so(1) でエラーを出力するまでの経緯について調査

$ man -s 1 ld.elf_so
(snip)
     $ORIGIN    The directory of the main object.  Implemented in ld.elf_so
                but the kernel support is currently disabled.

$ strings /libexec/ld.elf_so | grep AUX
Bad pAUX_base
execname not specified in AUX vector
bad execname `%s' in AUX vector

$ grep -n "execname not specified in AUX vector" /usr/src/libexec/ld.elf_so/*
/usr/src/libexec/ld.elf_so/expand.c:86:                 xerr(1, "execname not specified in AUX vector");

$ORIGINを展開しようとしているけど、kernelが対応してないのでエラーになるのですと。

調査過程

cmake(1)make(1) を行ったり来たりするので、どっちのコンテキストにいるのか意識する。

[  4%] Built target LLVMSupport
[  4%] Built target LLVMTableGen

   $ /vagrant/cmake-3.6.2/bin/cmake --build . --target LLVMTableGen -- -n
   /vagrant/cmake-3.6.2/bin/cmake -H/vagrant/llvm/dist/llvm -B/vagrant/build --check-build-system CMakeFiles/Makefile.cmake 0
   /usr/bin/make -f CMakeFiles/Makefile2 LLVMTableGen

   $ /usr/bin/make -n -f CMakeFiles/Makefile2 LLVMTableGen
   /vagrant/cmake-3.6.2/bin/cmake -H/vagrant/llvm/dist/llvm -B/vagrant/build --check-build-system CMakeFiles/Makefile.cmake 0
   /vagrant/cmake-3.6.2/bin/cmake -E cmake_progress_start /vagrant/build/CMakeFiles 0
   /usr/bin/make -f CMakeFiles/Makefile2 lib/TableGen/CMakeFiles/LLVMTableGen.dir/all
   /vagrant/cmake-3.6.2/bin/cmake -E cmake_progress_start /vagrant/build/CMakeFiles 0

   $ /usr/bin/make -n -f CMakeFiles/Makefile2 lib/TableGen/CMakeFiles/LLVMTableGen.dir/all
   /usr/bin/make -f lib/TableGen/CMakeFiles/LLVMTableGen.dir/build.make lib/TableGen/CMakeFiles/LLVMTableGen.dir/depend
   /usr/bin/make -f lib/TableGen/CMakeFiles/LLVMTableGen.dir/build.make lib/TableGen/CMakeFiles/LLVMTableGen.dir/build
   /vagrant/cmake-3.6.2/bin/cmake -E cmake_echo_color --switch= --progress-dir=/vagrant/build/CMakeFiles --progress-num= "Built target LLVMTableGen"

[  6%] Built target obj.llvm-tblgen
[  6%] Built target llvm-tblgen

   $ (cd /vagrant/build; /vagrant/cmake-3.6.2/bin/cmake --build . --target llvm-tblgen -- -n)
   /vagrant/cmake-3.6.2/bin/cmake -H/vagrant/llvm/dist/llvm -B/vagrant/build --check-build-system CMakeFiles/Makefile.cmake 0
   $ (cd /vagrant/build; /usr/bin/make -f CMakeFiles/Makefile2 llvm-tblgen)
   $ (cd /vagrant/build/; /usr/bin/make -f CMakeFiles/Makefile2 utils/TableGen/CMakeFiles/llvm-tblgen.dir/all)

/usr/bin/make -f lib/TableGen/CMakeFiles/LLVMTableGen.dir/build.make lib/TableGen/CMakeFiles/LLVMTableGen.dir/depend
/usr/bin/make -f lib/TableGen/CMakeFiles/LLVMTableGen.dir/build.make lib/TableGen/CMakeFiles/LLVMTableGen.dir/build
/vagrant/cmake-3.6.2/bin/cmake -E cmake_echo_color --switch= --progress-dir=/vagrant/build/CMakeFiles --progress-num= "Built target LLVMTableGen"
/usr/bin/make -f utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/build.make utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/depend
/usr/bin/make -f utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/build.make utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/build
/vagrant/cmake-3.6.2/bin/cmake -E cmake_echo_color --switch= --progress-dir=/vagrant/build/CMakeFiles --progress-num=98 "Built target obj.llvm-tblgen"
/usr/bin/make -f utils/TableGen/CMakeFiles/llvm-tblgen.dir/build.make utils/TableGen/CMakeFiles/llvm-tblgen.dir/depend
/usr/bin/make -f utils/TableGen/CMakeFiles/llvm-tblgen.dir/build.make utils/TableGen/CMakeFiles/llvm-tblgen.dir/build
/vagrant/cmake-3.6.2/bin/cmake -E cmake_echo_color --switch= --progress-dir=/vagrant/build/CMakeFiles --progress-num= "Built target llvm-tblgen"

   [ 75%] Built target LLVMSupport
   [ 75%] Built target LLVMTableGen
   [100%] Built target obj.llvm-tblgen
   [100%] Built target llvm-tblgen

[  6%] Building Attributes.inc...
execname not specified in AUX vector: No such file or directory
*** Error code 1

再現方法

/usr/bin/make -f include/llvm/IR/CMakeFiles/intrinsics_gen.dir/build.make include/llvm/IR/Attributes.inc

エラーメッセージを出しているところ

include/llvm/IR/CMakeFiles/intrinsics_gen.dir/build.make
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/vagrant/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building Attributes.inc..."

依存関係

include/llvm/IR/CMakeFiles/intrinsics_gen.dir/build.make
56:include/llvm/IR/CMakeFiles/intrinsics_gen: include/llvm/IR/Attributes.inc
60:include/llvm/IR/Attributes.inc: include/llvm/IR/Attributes.inc.tmp

cd /vagrant/build/include/llvm/IR && ../../../bin/llvm-tblgen -gen-intrinsic -I /vagrant/llvm/dist/llvm/include/llvm/IR -I /vagrant/llvm/dist/llvm/lib/Target -I /vagrant/llvm/dist/llvm/include /vagrant/llvm/dist/llvm/include/llvm/IR/Intrinsics.td -o /vagrant/build/include/llvm/IR/Intrinsics.gen.tmp

cd /vagrant/build/include/llvm/IR && ../../../bin/llvm-tblgen -gen-attrs -I /vagrant/llvm/dist/llvm/include/llvm/IR -I /vagrant/llvm/dist/llvm/lib/Target -I /vagrant/llvm/dist/llvm/include /vagrant/llvm/dist/llvm/include/llvm/IR/Attributes.td -o /vagrant/build/include/llvm/IR/Attributes.inc.tmp

ここまで来てどうやらビルド上の問題ではないなと気づいて、冒頭のFreeBSD開発者レポートに行きついた。 感のいい人だとtblgen実行時に動的リンクしようとして問題が起きているとことからld.elf_so(1)との関連を疑うんでしょうな。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment