共有ライブラリ内の関数をインターポジショニングしてみる

ls から呼んでいる共有ライブラリ内の関数を調べる。

-bash-3.00$ sotruss ls
ls              ->       libc.so.1:*atexit(0xff3c5bb4, 0x26000, 0x0)
ls              ->       libc.so.1:*atexit(0x14648, 0xff1d0140, 0xee12c)
ls              ->       libc.so.1:*setlocale(0x6, 0x14658, 0xff0b5900)
ls              ->       libc.so.1:*textdomain(0x1465c, 0xff05bd8e, 0xff1d0200)

...

setlocale ってのを呼んでるな。これをオーバーライドするてけとーなコードをCで書いて、

-bash-3.00$ cat foo.c 
#include <stdlib.h>
#include <stdio.h>
void setlocale(void) {
        printf("setlocale is overrided!\n");
        exit(0);
}

共有ライブラリとしてコンパイルして、

-bash-3.00$ cc -o foo.so -G -K pic foo.c 

ls コマンドを実行してみると、

-bash-3.00$ ls foo.*
foo.c   foo.so

普通に実行される。
次に ls の中で呼ばれている setlocale をオーバーライドしてみると、

-bash-3.00$ LD_PRELOAD_32=./foo.so ls foo.*
setlocale is overrided!

成功!


使った環境は以下の通り。

bash-3.00# cat /etc/release 
                   Oracle Solaris 10 9/10 s10s_u9wos_14a SPARC
     Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
                            Assembled 11 August 2010