PatchELFのビルド

[PatchELF] (http://nixos.org/patchelf.html) はロードモジュールのELF インタープリターや RPATH の表示、変更ができるツールです。

ソースからビルドするために、あらかじめビルドに必要なパッケージをインストールしておきます。
ビルドには g++ が必要ですので、gcc だけでなく g++ もしくは gcc-c++ など g++ コンパイラのパッケージもインストールしてください。

ソースを取得して展開します。

~~~
$ wget http://nixos.org/releases/patchelf/patchelf-0.8/patchelf-0.8.tar.bz2
$ tar xfa patchelf-0.8.tar.bz2
$ cd patchelf-0.8
~~~

`configure` を実行します。

~~~
$ ./configure --prefix=/usr/local
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for style of include used by make... GNU
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking dependency style of gcc... gcc3
checking whether gcc and cc understand -c and -o together... yes
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking dependency style of g++... gcc3
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating tests/Makefile
config.status: creating patchelf.spec
config.status: executing depfiles commands
~~~

`make` コマンドを実行します。

~~~
$ make
Making all in src
make[1]: Entering directory `/src/patchelf-0.8/src'
g++ -DPACKAGE_NAME=\"patchelf\" -DPACKAGE_TARNAME=\"patchelf\" -DPACKAGE_VERSION=\"0.8\" -DPACKAGE_STRING=\"patchelf\ 0.8\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"patchelf\" -DVERSION=\"0.8\" -I.     -g -O2 -MT patchelf.o -MD -MP -MF .deps/patchelf.Tpo -c -o patchelf.o patchelf.cc
mv -f .deps/patchelf.Tpo .deps/patchelf.Po
g++  -g -O2   -o patchelf patchelf.o
make[1]: Leaving directory `/src/patchelf-0.8/src'
Making all in tests
make[1]: Entering directory `/src/patchelf-0.8/tests'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/src/patchelf-0.8/tests'
make[1]: Entering directory `/src/patchelf-0.8'
make[1]: Nothing to be done for `all-am'.
make[1]: Leaving directory `/src/patchelf-0.8'
~~~

インストールします。

~~~
$ sudo make install
Making install in src
make[1]: Entering directory `/src/patchelf-0.8/src'
make[2]: Entering directory `/src/patchelf-0.8/src'
 /bin/mkdir -p '/usr/local/bin'
  /usr/bin/install -c patchelf '/usr/local/bin'
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/src/patchelf-0.8/src'
make[1]: Leaving directory `/src/patchelf-0.8/src'
Making install in tests
make[1]: Entering directory `/src/patchelf-0.8/tests'
make[2]: Entering directory `/src/patchelf-0.8/tests'
make[2]: Nothing to be done for `install-exec-am'.
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/src/patchelf-0.8/tests'
make[1]: Leaving directory `/src/patchelf-0.8/tests'
make[1]: Entering directory `/src/patchelf-0.8'
make[2]: Entering directory `/src/patchelf-0.8'
make[2]: Nothing to be done for `install-exec-am'.
 /bin/mkdir -p '/usr/local/share/doc/patchelf'
 /usr/bin/install -c -m 644 README '/usr/local/share/doc/patchelf'
 /bin/mkdir -p '/usr/local/share/man/man1'
 /usr/bin/install -c -m 644 patchelf.1 '/usr/local/share/man/man1'
make[2]: Leaving directory `/src/patchelf-0.8'
make[1]: Leaving directory `/src/patchelf-0.8'
~~~

できあがり。

~~~
$ /usr/local/bin/patchelf
syntax: /usr/local/bin/patchelf
  [--set-interpreter FILENAME]
  [--print-interpreter]
  [--set-rpath RPATH]
  [--shrink-rpath]
  [--print-rpath]
  [--force-rpath]
  [--remove-needed LIBRARY]
  [--debug]
  [--version]
  FILENAME
~~~

~~~
$ printf '#include <stdio.h>\nmain() {printf("hello world\\n");}\n' >hello.c
$ cat hello.c 
#include <stdio.h>
main() {printf("hello world\n");}
$ gcc hello.c 
$ /usr/local/bin/patchelf --print-rpath a.out 
$ /usr/local/bin/patchelf --set-rpath /usr/local/lib a.out 
$ /usr/local/bin/patchelf --print-rpath a.out 
/usr/local/lib
~~~