私の質問: C標準で保証関数ポインタの平等が関数ポインタ平等
- ですか?
- (1)の答えが「はい」の場合。これは、異なる最終コンパイル単位(例えば、メイン実行可能ファイルと共有ライブラリ)で得られたポインタに関係なくですか?
- どのようにダイナミックローダーがそれに対処していますか? (これは難しいかもしれないいくつかの理由を考えることができます.PICコード(例えば、elfのGOTテーブル、それに相当するCOFFなど)に関連しています。 (1)と(2)に関係なく、Linuxローダーはこれを保証しているようです。
次に例を示します。上記の質問は、main.c
が何を出力するかをCが保証するかどうかまでわかります:"Function equality: 1"
または"Function equality: 0"
そして、最初のケースでは、どのようにしてダイナミックローダーが発生しますか? UNIXで
common.h:
extern void * getc_main;
extern void * getc_shared;
void assign_getc_shared();
main.c:
#include <stdio.h>
#include "common.h"
int main()
{
getc_main = (void*) getc;
assign_getc_shared();
printf("Function equality: %d\n", getc_main == getc_shared);
return 0;
}
shared.c:
#include <stdio.h>
#include "common.h"
void assign_getc_shared()
{
getc_shared = (void*) getc;
}
この次のコマンドを使用してコンパイルされます:
cc -shared -fPIC -o libshared.so shared.c
cc -o main main.c -L. -lshared
として実行:
LD_LIBRARY_PATH=. ./main
これは、標準ライブラリ関数が実行可能ファイルに1回しか含まれないことを保証しているのかというとかなり長い時間です。 –
そして、私はリスター氏の質問に対する答えは "いいえ、保証されていません" 。たとえば、関数はインライン化されていてもよく、インライン関数のアドレスをとると、コード内に「実際の」関数として含まれます。つまり、同じソース関数に対して複数の関数が存在する可能性があります。 –
@ MrListerもし私がそれだけを知りたいと思っていたら、私はそれに尋ねただけです。余分な質問をする理由は、ダイナミックローダーがこの問題をどう扱うかについての詳細を知りたいからです。あなたのコメントから、あなたはそうではないと思います。それは問題ありません。 – fons