5

間違ったバージョンの関数が呼び出されてセグメンテーション違反が発生する問題をデバッグしようとしています。私がコンパイルしているコードは機械で生成されたもので、2 つの引数の複雑な乗算を行う「times」という関数が含まれています。このコードは、より高いレベルのオブジェクト ファイルにリンクされる前に、.o にコンパイルされます。

このコードを実行すると、segfaults が発生し、gdb は、同じ数の引数を取らない glibc のバージョンの「times」にあることを示します。このコードのどこにも '#include のインスタンスはありません。

times の名前を times1 に変更すると、問題が解決します。これは長期的な解決策ではありませんが、機械で生成されたコードの性質と、この関数の名前を常に手動で編集することは魅力的ではありません。

全体の混乱は -Wall でクリーニングをコンパイルするため、どこを見ればよいかわかりません。これを解決する方法についてのアイデアはありますか?

Compile chain:
    gcc -Wall -I. -g --shared -o dpd.o -fPIC *.c (mahine generated code here)
    gcc -g --std=c99 -c -fpic getData.c -I/usr/local/include -L/usr/local/lib -lmatio -I/usr/local/include/iverilog -I$(MATLAB)
    gcc -g -shared -o getData.vpi getData.o $(MATLAB)/dpd.o -lvpi -lmatio -L/usr/local/lib
4

2 に答える 2

3

C は関数の名前のみを識別子として使用するため、同じ名前の 2 つの (エクスポートされた) 関数は競合します。通常のアプローチでは、ライブラリ内のエクスポートされたすべての名前に一意のプレフィックスを付けます。もう 1 つの方法は、C++ を「より優れた C」として使用し、C++ コンパイラを使用して C コードをビルドし、C++ の名前マングリングを利用することです。

于 2012-11-02T22:51:54.657 に答える
0

したがって、これに対する本当の答えは-fno-builtin-timesgccにスローすることです。それは大騒ぎなしで問題をきちんと回避します。

timesもちろん、これは、名前をglibcが提供する関数と競合しない名前に変更できないことを前提としています。

于 2012-11-28T15:20:41.107 に答える