[解決済み] rdynamic` は具体的に何をするもので、どのような場合に必要なのでしょうか?
質問
は具体的にどのようなものですか?
-rdynamic
(または
--export-dynamic
で定義されるシンボルの可視性とどのような関係があるのでしょうか?
-fvisibility*
フラグまたは可視性
pragma
と
__attribute__
s?
について
--export-dynamic
,
ld(1)
が言及されています。
... を参照する必要がある動的オブジェクトをロードするために "dlopen" を使用した場合、その動的オブジェクトは、その動的オブジェクトを参照する必要があります。 プログラムによって定義されたシンボルではなく、他のダイナミックな オブジェクトを使用する場合、おそらく このオプションは、プログラム自体をリンクするときに使用します。...
完全に理解できているわけではないのですが。を使用しないと動作しない例を提示していただけませんか?
-rdynamic
しかし、それがある場合はどうなるのでしょうか?
編集
:
実際にいくつかのダミーライブラリ(シングルファイル、マルチファイル、様々な-Oレベル、いくつかの関数間呼び出し、いくつかの隠しシンボル、いくつかの見えるもの)を、ある場合とない場合でコンパイルしてみました。
-rdynamic
で、今のところ
バイトアイデンティカル
が出力され、非常に不可解です(もちろん、他のすべてのフラグを一定にした場合)。
解決方法は?
の使用方法を説明するための簡単なサンプルプロジェクトです。
-rdynamic
.
bar.c
extern void foo(void);
void bar(void)
{
foo();
}
main.c
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
void foo(void)
{
puts("Hello world");
}
int main(void)
{
void * dlh = dlopen("./libbar.so", RTLD_NOW);
if (!dlh) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
void (*bar)(void) = dlsym(dlh,"bar");
if (!bar) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
bar();
return 0;
}
メイクファイル
.PHONY: all clean test
LDEXTRAFLAGS ?=
all: prog
bar.o: bar.c
gcc -c -Wall -fpic -o $@ $<
libbar.so: bar.o
gcc -shared -o $@ $<
main.o: main.c
gcc -c -Wall -o $@ $<
prog: main.o | libbar.so
gcc $(LDEXTRAFLAGS) -o $@ $< -L. -lbar -ldl
clean:
rm -f *.o *.so prog
test: prog
./$<
ここです。
bar.c
は共有ライブラリになります。
libbar.so
と
main.c
となる
というプログラム
dlopen
s
libbar
と呼びます。
bar()
をそのライブラリから取得します。
bar()
コール
foo()
で外部である
bar.c
で定義され
main.c
.
つまり
-rdynamic
:
$ make test
gcc -c -Wall -o main.o main.c
gcc -c -Wall -fpic -o bar.o bar.c
gcc -shared -o libbar.so bar.o
gcc -o prog main.o -L. -lbar -ldl
./prog
./libbar.so: undefined symbol: foo
Makefile:23: recipe for target 'test' failed
そして
-rdynamic
:
$ make clean
rm -f *.o *.so prog
$ make test LDEXTRAFLAGS=-rdynamic
gcc -c -Wall -o main.o main.c
gcc -c -Wall -fpic -o bar.o bar.c
gcc -shared -o libbar.so bar.o
gcc -rdynamic -o prog main.o -L. -lbar -ldl
./prog
Hello world
関連
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] g++とgccの違いは何ですか?
-
[解決済み] 8192個の要素にループをかけると、プログラムが遅くなるのはなぜですか?
-
[解決済み] LLVMとは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】エラー:イニシャライザー要素がロード時に計算可能でない
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み] Cプログラムで「配列の添え字が整数でない」。
-
[解決済み】シンプルなC言語のscanfが機能しない?重複