2

私は同様の質問をしましたが、本当に混乱している更新があります。基本的に、次のようにリンカーを使用して多数のオブジェクト ファイルをリンクしたいと考えています。

/usr/ccs/bin/ld -o q -e start_master -dn -z defs -M ../../../mapfile.q {list of object files}

次のエラーが表示されます。

Undefined                       first referenced 
 symbol                             in file
_memset                             reconf.o

興味深いのは、memset が reconf.c で参照されておらず、ディレクトリ全体も grep しましたが、他のどのファイルにも _memset への参照がないことです。したがって、ソース コードのどこにも _memset が実際に使用されていないのに、なぜリンカからこのエラー メッセージが表示されるのか不思議に思っています。ここで何が起こっているのか誰にもわかりませんか?

どうもありがとう、このエラーは私たちを精神的に駆り立てています!

編集:

memset のライブラリへのパスを追加して -lc にリンクし、詳細モードで実行しようとしました。

/usr/ccs/bin/ld -o q -e start_master -dn -z defs -z verbose -L/usr/lib -M ../../../mapfile.q {list of object files} -lc

次に、次のエラーが表示されます: ld: 致命的: ライブラリ -lc: 見つかりません ld: 致命的: ファイル処理エラー。q に出力が書き込まれません

そしてこれ libc.so は明らかに /usr/lib にありますが...

紛らわしい

編集II:

ここで読むことができるように、さらに調査を行うと、Solaris 10 では静的リンクが消えたようです。

http://blogs.oracle.com/rie/entry/static_linking_where_did_it

おそらくこれは私の問題です。この問題を回避するためにリンカー コマンドを書き直す方法を知っている人はいますか?

どうもありがとう!

4

3 に答える 3

2

おそらくあなたはしました:

struct S v = { 0 };

また

struct S v;
v = (some const-variable).

また

uint8_t b[100] = { 0 };

一部のコンパイラは、そのようなもののために組み込みのmemset(またはmemcpy)を暗黙的に配置しています。組み込みのmemsetは_memsetと呼ばれます(あなたの場合)。リンクしてlibc(またはあなたの場合は標準機能を提供するもの)がそれを提供しないと、このリンクエラーが発生します。

于 2011-08-10T10:37:10.207 に答える
1

libc.soSolaris を使用していると仮定すると、ライブラリに memset が見つかります。

/usr/lib-> nm libc.so | grep memset
[7122]  |    201876|     104|FUNC |GLOB |0    |9      |_memset

-lcコマンドラインに追加するだけ

于 2011-08-10T10:39:23.587 に答える
0

Memset は、標準 C ライブラリのライブラリ関数です。リンクに gcc を使用しない場合 (デフォルトでファイルを標準ライブラリにリンクします)、プログラムを明示的に libc にリンクする必要があります。

もう 1 つのオプションでは、おそらく libc を使用していません。この場合、memset 呼び出しは gcc によって生成される可能性があります。

からman gcc:

-nodefaultlibs

リンク時に標準システム ライブラリを使用しないでください。指定したライブラリのみがリンカに渡され、-static-libgcc や -shared-libgcc などのシステム ライブラリのリンケージを指定するオプションは無視されます。-nostartfiles が使用されない限り、標準の起動ファイルが通常どおり使用されます。コンパイラは、memcmp、memset、memcpy、および memmove への呼び出しを生成する場合があります。これらのエントリは通常、libc のエントリによって解決されます。このオプションが指定されている場合、これらのエントリ ポイントは、他のメカニズムを介して指定する必要があります。

この場合、単純に memset を記述して (これは簡単な手順です)、リンカーに提供します。

于 2011-08-10T10:46:06.480 に答える