1

2 つの動的ライブラリをロードする必要があり、関数名の競合が 1 つあります。そこで、「objcopy --redefine-sym add=new_add libmy_test.so libmy_test_new.so」というコマンドを使用して、シンボル名を変更します。

しかし、それでも「エラー: ./libmy_test_new.so: 未定義のシンボル: new_add」が報告されます。

以下は私のテストコードです。

void *lib_handle2 = dlopen("./libmy_test_new.so", RTLD_NOW);
if (NULL == lib_handle2) {
    printf("Error: %s\n", dlerror());
    goto err1;
}

fp_add f_add2 = dlsym(lib_handle2, "new_add");
if (NULL == f_add2) {
    printf("Error: %s\n", dlerror());
    goto err2;
}
4

1 に答える 1

2

このページによると、動的シンボルでは動作しないようです。詳細については、元のスレッドを参照してください。両方のシンボルを使用したい場合は、何らかの形でライブラリの 1 つを再リンクする必要があります。ただし、シンボルの 1 つだけが必要な場合は、リンク順序が役立つ場合があります。

おそらく解決策は、2 つのライブラリを dlsopen し、2 つの新しいシンボルを作成し、正しいハンドルで dlsym を使用してそれらを割り当てるラッパー ライブラリを作成することです。

void *lib_handle1 = dlopen("./lib1.so", RTLD_NOW);
void *lib_handle2 = dlopen("./lib2.so", RTLD_NOW);

fp_add f_add1 = dlsym((lib_handle1, "add");
fp_add f_add2 = dlsym(lib_handle2, "add");

もちろん、ライブラリ内で生成された呼び出しの問題は解決しません。

于 2010-10-13T07:20:15.357 に答える