14

lib.c動的ライブラリ ( ) とメイン実行可能ファイル ( )で構成されるコードを作成しましたmain.c。両方のファイルで、次の名前のグローバル変数を定義しますint global。あまり賢くはありませんが、それは問題ではありません。

動的ライブラリをコンパイルすると、-fPICオプションは必須のようです:

gcc lib.c -fPIC -shared -o lib.so

そうでなければ私は得る:

/usr/bin/ld: /tmp/ccpUvIPj.o: relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC

実行可能ファイルをコンパイルすると、そうではありません。

gcc main.c -fPIC -ldl
gcc main.c -ldl

どちらも機能しますが、説明できない動作が異なりますね。:

-fPIC を使用すると、main.c のグローバルと lib.c のグローバルは同じ変数になります。

global main: 23 (0x601050)
global lib: 23 (0x601050)

-fPIC を使用しないと、lib.c のグローバルは main.c のグローバルに関連付けられません。

global main: 23 (0x601048)
global lib: 0 (0x7f7742e64028)

ソースは次のとおりです。

lib.c

#include <stdio.h>
#include <stdlib.h>

int global;

int f_one() {

    printf("global lib: %d (%p)\n", global, &global);

    return EXIT_SUCCESS;
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

void * handle;
int global;

int main() {

    int q = 7;

    int (* f_one_p)(int a) = NULL;

    global = 23;

    handle = dlopen("./lib.so", RTLD_NOW);

    if (handle == 0) {
        return EXIT_FAILURE;
    }

    f_one_p = dlsym(handle, "f_one");

    printf("global main: %d (%p)\n", global, &global);

    f_one_p(q);

    return EXIT_SUCCESS;

}

gcc --バージョン: gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2

uname -a: Linux xxx 2.6.38-11-generic #48-Ubuntu SMP Fri Jul 29 19:02:55 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

edit : SUN/sparc および x86/Linux アーキテクチャで、同じ種類の予期しない共有グローバル変数 (-fPIC を使用) を使用してテストされたコード。

4

2 に答える 2

8

問題のオブジェクトをコンパイルすると、 Global Offset Table-fPICを使用してグローバル シンボルのアドレスが決定されます。ただし、コードの一部がそうで一部がそうでない場合、一方のs がこのテーブルを使用してアドレスを決定し、もう一方の部分はそうではないということです。-fPICint global

にリンクされた 2 つの共有オブジェクト-fPICがあり、メイン プログラムがリンクされていない場合でもint global、グローバル オフセット テーブルを使用するアドレスと非 PIC コードに対してローカルなアドレスの 2 つがあります。

さらに読みたい場合は、PIC vs pic vs 非 PIC に関する非常に優れた議論があります。

于 2011-09-04T09:26:18.323 に答える
1

デフォルトでは、実行可能ファイルをビルドするとき、変数への参照は内部的に行われ、固定オフセットと再配置はありません。

ただし、渡している-fPICとグローバル データへのアクセスが GOT 経由のアクセスに変換され、GOT の再​​配置が追加されます。

于 2011-09-04T09:27:11.207 に答える