linker script

なんとなくリンカスクリプト回りを眺めた。いじったら面白そうなのは ENTRY と GROUP かなぁ… ENTRY はまぁ僕は glibc には頼りません!って人、っていうか環境くらいか。

GROUP はなんか mingw32 でいつも SDL とかのリンクに苦労しまくってる時の解決になる気が。 -( -) オプションでもいいらしいけど。

あとディストリビューションがやってるけど、ある程度セットになってるライブラリをなんかまとめておくってのも面白いなとか思った。以下みたいな感じ。

> cat libbfdwrap.so
GROUP ( -lbfd -liberty )

あと CREATE_OBJECT_SYMBOLS ってのもなんか便利そう。 a.o と b.o っていうのをリンクしたら a.o っていうシンボルと b.o っていうシンボルができるとのこと、だけど、 C からこんな名前のシンボル使いにくい気もする。

あと FILL とかそのへん。 0xdeadbeaf で埋めたりとか。

ポインタの正体を究明。

#include <stdio.h>

extern void *__executable_start;
extern void *etext;
extern void *__bss_start;
extern void *end;

void print_where(void *vp) {
    void **p = (void **)vp;
    if (&__executable_start > p) {
        printf("i guess it's not pointer\n");
    }
    else if (&etext > p) {
        printf("it's in .text\n");
    }
    else if (&__bss_start > p) {
        printf("data or ... i don't know\n");
    }
    else if (&end > p) {
        printf("it's in .bss\n");
    }
    else {
        printf("i guess it's in heap or shared library or stack or ...\n");
    }
}

int global_variable;

int main(int argc, char *argv[]) {
    static int static_variable;

    print_where(&main);
    print_where(&print_where);
    print_where(&global_variable);
    print_where(&static_variable);
    print_where(&argc);
    print_where("hello");
    print_where(NULL);

    return 0;
}

実行すると以下のような感じ。

it's in .text
it's in .text
it's in .bss
it's in .bss
i guess it's in heap or shared library or stack or ...
data or ... i don't know
i guess it's not pointer

なんかどうせなら各セクションの前後に埋めてくれてもいいのにとか。まぁ .text なめていじるとかできて面白いこともあるかもしれないけどあんま無いかも。

とか思ったら wo さんが似たようなことをやっていた。

http://d.hatena.ne.jp/w_o/20060104#p3

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h