2

ELFについて学習しています。共有ライブラリをリンクする際の位置依存実行ファイルと位置非依存実行ファイルのelf形式の違いを知りたいです。

しかし、共有ライブラリとリンクするときに、実行可能ファイルの位置依存コードを生成できません。

/*Lib.c*/
static int a;
extern int b;
int c=1;
extern void exit();
void set_value()
{
    a=1;
    b=1;
    c=1;
}
void run()
{
    set_value();
    exit();
}

まず、gcc を使用して共有動的ライブラリを生成します。

gcc -m32 -nostdlib -o Lib.so Lib.c

-fpic を使用して、Lib.so の位置に依存しないコードを生成しないことに注意してください。

ここで、Lib.so とリンクする必要がある別のファイル main.c があります。

/*main.c*/
extern void run();
int b=2;
void nomain()
{
    run();
}
void exit()
{
    asm("int $0x80 \n\t"
        ::"a"(1),"b"(42));

}

次のコマンドを使用して、main.c を Lib.so にリンクします。

gcc  -m32 -e nomain  -nostartfiles  -fno-builtin  -o a.out main.c ./Lib.so

ただし、gcc は共有ライブラリとリンクする場合、このライブラリが pic を使用していなくても、デフォルトで main.c を位置独立コードにコンパイルします。

gcc には、実行可能ファイルの位置依存を生成するオプションがあるのだろうか?

Lib.so と a.out のセクション情報を投稿します。a.out に '.plt' と '.got.plt' セクションがあり、a.out が PIC を使用することを意味します。

  /*Section for Lib.so*/
  Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .gnu.hash         GNU_HASH        000000b4 0000b4 00003c 04   A  2   0  4
  [ 2] .dynsym           DYNSYM          000000f0 0000f0 000090 10   A  3   1  4
  [ 3] .dynstr           STRTAB          00000180 000180 000030 00   A  0   0  1
  [ 4] .rel.dyn          REL             000001b0 0001b0 000028 08   A  2   0  4
  [ 5] .text             PROGBITS        000001d8 0001d8 000033 00  AX  0   0  4
  [ 6] .dynamic          DYNAMIC         0000120c 00020c 000078 08  WA  3   0  4
  [ 7] .got.plt          PROGBITS        00001284 000284 00000c 04  WA  0   0  4
  [ 8] .data             PROGBITS        00001290 000290 000004 00  WA  0   0  4
  [ 9] .bss              NOBITS          00001294 000294 000004 00  WA  0   0  4
  [10] .comment          PROGBITS        00000000 000294 00002e 00      0   0  1
  [11] .shstrtab         STRTAB          00000000 0002c2 00006a 00      0   0  1
  [12] .symtab           SYMTAB          00000000 00055c 000170 10     13  15  4
  [13] .strtab           STRTAB          00000000 0006cc 000057 00      0   0  1
  /*Section for a.out*/
  Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        080480f4 0000f4 000013 00   A  0   0  1
  [ 2] .gnu.hash         GNU_HASH        08048108 000108 000034 04   A  3   0  4
  [ 3] .dynsym           DYNSYM          0804813c 00013c 000070 10   A  4   1  4
  [ 4] .dynstr           STRTAB          080481ac 0001ac 000037 00   A  0   0  1
  [ 5] .rel.plt          REL             080481e4 0001e4 000008 08   A  3   6  4
  [ 6] .plt              PROGBITS        080481ec 0001ec 000020 04  AX  0   0  4
  [ 7] .text             PROGBITS        0804820c 00020c 000020 00  AX  0   0  4
  [ 8] .dynamic          DYNAMIC         0804922c 00022c 000090 08  WA  4   0  4
  [ 9] .got.plt          PROGBITS        080492bc 0002bc 000010 04  WA  0   0  4
  [10] .data             PROGBITS        080492cc 0002cc 000004 00  WA  0   0  4
  [11] .comment          PROGBITS        00000000 0002d0 00002e 00      0   0  1
  [12] .shstrtab         STRTAB          00000000 0002fe 00006d 00      0   0  1
  [13] .symtab           SYMTAB          00000000 0005c4 000160 10     14  15  4
  [14] .strtab           STRTAB          00000000 000724 000051 00      0   0  1
4

1 に答える 1

0

Lib.soでコンパイルする必要がありますgcc -Wall -Wextra -m32 -shared -Wl,-soname,Lib.so -o Lib.so Lib.c

ここでやったことは、再配置情報なしで通常のプログラムを生成するだけです。

動的ライブラリの詳細については、このチュートリアルをご覧ください。

LD_LIBRARY_PATH: また、を指すように環境変数を設定することを忘れないでくださいLib.so

于 2013-04-21T07:17:57.310 に答える