Ubuntu14.04上でglibcをbuildしてリンクする
glibc内のソースをいじりたかったのでその前準備にglibcソースからビルドしてコードにリンクするまでの手順をメモ
環境
vagrant@vagrant-ubuntu-trusty-64:~/libc$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.04 Codename: trusty
vagrant上で動かしてます
glibcの取得
$ sudo apt-get update $ mkdir -p ~/libc/build # libcのビルド用ディレクトリを作成します。build用ディレクトリを分けないとconfigure時に怒られるため $ cd ~/libc $ sudo apt-get install -y dpkg-dev $ sudo apt-get source libc6
終わったときの~/libc
の中はこんな感じのはず
vagrant@vagrant-ubuntu-trusty-64:~/libc$ ll total 13360 drwxrwxr-x 4 vagrant vagrant 4096 Oct 17 09:21 ./ drwxr-xr-x 6 vagrant vagrant 4096 Oct 17 09:54 ../ drwxrwxr-x 60 vagrant vagrant 4096 Oct 17 09:42 build/ drwxr-xr-x 73 root root 4096 Oct 17 09:14 eglibc-2.19/ -rw-r--r-- 1 root root 1043124 Jan 17 2018 eglibc_2.19-0ubuntu6.14.debian.tar.xz -rw-r--r-- 1 root root 7195 Jan 17 2018 eglibc_2.19-0ubuntu6.14.dsc -rw-r--r-- 1 root root 12610800 Feb 21 2014 eglibc_2.19.orig.tar.xz
configureとmake
最終的に吐き出すディレクトリは /usr/eglibc-2.19
にします。これは好きなディレクトリで大丈夫です
$ sudo mkdir -p /usr/eglibc-2.19 $ ~/libc/build $ ../eglibc-2.19/configure --prefix=/usr/eglibc-2.19 --enable-add-ons=nptl --enable-all-warnings $ sudo make # かなり時間がかかります $ sudo make install
以上で /usr/eglibc-2.19
以下にビルドされたファイル群が存在すれば大丈夫です
テスト用のコードとビルド
試しに以下のコードを書いてコンパイルしてみます
#include <stdio.h> int main() { printf("hello\n"); exit(0); }
Makefileはこんな感じ
CC=gcc CFLAGS = -nostdinc -I/usr/eglibc-2.19/include -I/usr/lib/gcc/x86_64-linux-gnu/4.8/include LDFLAGS = -Wl,-rpath=/usr/eglibc-2.19/lib TARGET = test.exe OBJECTS = test.o all: $(TARGET) $(TARGET):$(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $(TARGET) .c.o: $(CC) $(CFLAGS) -c -o $@ $< clean: rm -f *.o $(TARGET)
CFLAGSとLDFLAGSに指定しているパスは各自がconfigure時に設定したprefixパスに合わせてください
makeして ldd
コマンドで指定したglibcにリンクできているか確認します
vagrant@vagrant-ubuntu-trusty-64:~$ ldd test.exe linux-vdso.so.1 => (0x00007ffe58f8d000) libc.so.6 => /usr/eglibc-2.19/lib/libc.so.6 (0x00007f34057a3000) /lib64/ld-linux-x86-64.so.2 (0x00007f3405b50000)
libc.so.6の部分が上のように指定したlibcになっていればokです