SWEet

A Software Engineer Is Eating Technologies

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です