« コメントがおかしい? | トップページ | 擬似的末尾再帰最適化 »

2007年10月 5日 (金)

シンボルテーブルのFUNCについて

naoyaさんのところで見かけて気になったので調べてみた。

などをみてみると、シンボルテーブルのTypeのFUNCはリンクの辺りで必要そう。

そこで、

int add(int x, int y)
{
    return x + y;
}

int sub(int x, int y)
{
    return x - y;
}

をfunc.cとして作成して、

$ gcc -S func.c

としてアセンブリコードを作成。

.globl add
    .type   add, @function

となっているところを

,globl add
    .type    add, @notype

と変更する。それから共有ライブラリを作成する。共有ライブラリを参考に

$ gcc -fPIC -g -c -Wall func.s
$ gcc -shared -Wl,-soname,libfunc.so.1 -o libfunc.so.1.0.1 func.o -lc
$ ln -s libfunc.so.1.0.1 libfunc.so.1
$ ln -s libfunc.so.1.0.1 libfunc.so

一応共有ライブラリのaddの属性の確認をする。

$ readelf -s libfunc.so | grep add
     6: 000003cc    11 NOTYPE  GLOBAL DEFAULT   10 add
    49: 000003cc    11 NOTYPE  GLOBAL DEFAULT   10 add

確かにNOTYPEとなっています。
次にこの共有ライブラリを使用するプログラムをmain.cとして作成します。

     1  #include <stdio.h>
     2
     3  int add(int, int);
     4  int sub(int, int);
     5
     6  int main()
     7  {
     8      int x, y;
     9
    10      x = 8;
    11      y = 4;
    12
    13      printf("%d\n", add(x, y));
    14      printf("%d\n", sub(x, y));
    15
    16      return 0;
    17  }

さて、ここからが本番です。

$ export LD_LIBRARY_PATH=.
$ gcc main.c -L. -lfunc
$ ./a.out
セグメンテーション違反です

となりました。main.cのaddをしている行を消して、

$ gcc main.c -L. -lfunc
$ ./a.out
4

となりsubの実行結果が表示されます。なので、シンボルテーブルのTypeのFUNCは動的リンクに必要にであることが分かりました。mainにFUNCをつける必要はないみたいですね。FUNCじゃなくてEXPO(export)とかの方が分かりやすかったりするのかなとか思ったりしました。

|

« コメントがおかしい? | トップページ | 擬似的末尾再帰最適化 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/126478/16669401

この記事へのトラックバック一覧です: シンボルテーブルのFUNCについて:

» 「属性」を見直す [アフィリエイトで毎日幸せじゃけん]
いつも読んで頂きありがとです。!! 感謝の気持ちを込めてブログ書いてます 今日のインフォトップランキングは何位? ☆☆今日の人気ブログは何位?☆☆  アフィリエイトで幸せなカフェタイム はメルマガアフィリエイトなので 「属性」はメルマガアフィリエイト ですね! だから、これを読んでる 方は、必然的に 「属性」は、私と同じですよね この「属性」を常に意識しないと 大変な事になるんです。 だって、オー ... [続きを読む]

受信: 2007年10月 5日 (金) 午後 09時52分

« コメントがおかしい? | トップページ | 擬似的末尾再帰最適化 »