AIX

  
でのライブラリー・ファイルの使用およびライブラリー・ファイルの作成

は、動的リンク・ライブラリー、静的ライブラリー、静的リンク、動的リンク、および最近聞いた実行時リンクによって混乱しています。静的リンクはコンパイル時リンク、生成ファイルは大きい、動的リンクは実行時リンク、そして生成ファイルは小さいことは誰でもが知っています。私は誰もが知りません、あるいは誰もが知っていると思います...ときどきwindows、ときどきlinux、ときどきgix、ときにはg ++、ときにはcc、ときには.so、ときには.a、ときには.daもします。 .lib時には.o、あまりにも多くの矛盾、そしてあまりにも多くの問題を抱えています。また、作業環境としてAixを使用することもよくありますが、.soはダイナミックリンクライブラリ、.aはスタティックリンクライブラリと言っている人もいますが、Aixではそうではありません。今週末、私はvacのxlcとccs ldを使用してAixでこれらの問題を調査するのに2日間を費やしました。今すぐ要約してください。

一つ、リンクファイルとリンク方法。実際、動的リンクと動的リンクについて慎重に検討しないことが、私の混乱の主な理由です。私がこの問題を考える理由は、作業中にライブラリaを書き、次にaをコンパイルし、次に別のライブラリbを書くことです。bはaに依存し、その過程でbをコンパイルしなければなりません。 aをコンパイルしたときにリンク方法を使用しましたが、今は使用したいのですが。そこで、私はリンクファイルとリンク方法を区別し始め、実行可能プログラムhello.cに静的にリンクされたライブラリファイルlibc.aを使用して以下の実験1を開始しました。

Cコードコピーコード#include< stdio.h> Int main(){printf(" Hello、world!\\ n");} #include< stdio.h> int main(){printf(" Hello、world!\\ n");}#xlcを実行 - o hello.o -c hello.cターゲットファイルhello.oを生成します。ld -o hello_s -bstatic hello.o -lcを実行します。hello.oとlibc.aを静的にリンクして、実行可能ファイルhello_sを生成します。実行可能ファイルを生成するためにxlcを直接使用するのではなく、各ステップを把握したかったのですが、その結果、多くの時間と無限の検索が必要になりました。 -bnsoは、ld静的リンクを指示しています。 (xlcの-Eおよび-Sパラメーターを使用して、hello.cの前処理ファイルとアセンブリファイルを調べてから、asを使用してアセンブリファイルをコンパイルし、オブジェクトファイルを生成することもできます。)結果ld:0711-327警告:エントリポイントが見つかりません:__start Ld:0711-244エラー:csectsもエクスポートされたシンボルも保存されていません__startが見つかりません、この__startはシステムのサブプロセスによく似ています。このエラーの原因は、リンク時にそのようなライブラリ/usr/lib/crt0.oを追加しなかったためです。静的に直接リンクするためにxlcを使用する場合、このライブラリはxlc自身によって追加されるべきです(このライブラリはスレッドのようです)。初期化関連)、nmコマンドを使用して、このターゲットファイルに関連付けられている__startを含むシンボルを表示できます。そのため、ld -o hello_s -bstatic hello.o -lc /usr/lib/crt0.oを実行します。ld:0711-224警告:重複したシンボル:.is_posix_tz ld:0711- 224警告:シンボルが重複しています:.__ icuinit ld:0711-345詳細情報を入手するには、-bloadmapまたは-bnoquietオプションを使用してくださいld:0711-317エラー:未定義のシンボル:__loadx ld:0711-317エラー:未定義のシンボル:_system_TB_config ld: 0711-317エラー:未定義シンボル:errno ld:0711-317エラー:未定義シンボル:.___ bzero ld:0711-317エラー:未定義シンボル:smcr_timebase ld:0711-317エラー:未定義シンボル:.___ memmove ld:0711-317 ERROR :未定義シンボル:.___ memset ld:0711-317エラー:未定義シンボル:_system_configuration ld:0711-317エラー:未定義シンボル:disclaim ld:0711-317エラー:未定義シンボル:kwritev ld:0711-317エラー:未定義シンボル:kpwritev Ld:0711-317エラー:未定義シンボル:kpwrite ld:0711-317エラー:未定義シンボル:kwrite ld:0711-317エラー:未定義シンボル:kopenx ... ldプロンプト-bloadmapを実行して特定のエラーメッセージを表示します。したがって、ld -o hello_s -bstatic hello.o -lc /usr/lib/crt0.o -bloadmap:out.txtを実行して、出力ファイルを表示します。ld:0711- 318エラー:未定義のシンボルが見つかりました次のシンボルにエラーがあります:シンボルInpndx TY CLソースファイル(オブジェクトファイル)またはインポートファイル{共有オブジェクト} RLD:アドレスセクションRldタイプ参照シンボル----- -------------------------------------------------- --------------------------------------- __loadx [262] ER DS(/usr /lib /libc.a[shr.o])0006919c.data R_POS [1658]< _ loadx> _system_TB_config [792] ER UA(/usr/lib/libc.a[shr.o])000691a8.data R_POS [1664]<; _system_TB_config> errno [8] ER UA(/usr/lib/libc.a [shr.o])00068e3c .data R_POS [1226] ...これはlibc.aのshr.oの定義の一部です。シンボルが見つからないので、このshr.oを解決し、ar -x /usr/lib/libc.a shr.oを実行してshr.oを取得し、次にldd shr.oを実行してshr.oに必要な出力を取得します。/unix /Usr /lib /libcrypt.a(shr.o)/usr/lib/libc.a(shr.o)これHr.oは上記の3つのライブラリlibc.aを必要とします。今見付からないシンボルは、システムコールです。 ldのマニュアルをチェックして、システムコールのシンボルテーブル/lib/syscalls.expをインポートする必要があることを確認してくださいので、#ld -o hello_s -bstatic hello.o -lc /usr/lib/crt0.o -bI:/lib /を実行します。 syscalls.expの結果はまだエラー#ldを報告します。-o hello_s -bstatic hello.o -lc /usr/lib/crt0.o -bI:/lib/syscalls.exp ld:0711-224警告:重複したシンボル:.open ld:0711 -224警告:シンボルが重複しています:.openx ld:0711-224警告:シンボルが重複しています:.is_posix_tz ld:0711-224警告:シンボルが重複しています:.__ icuinit ld:0711-224警告:重複しているシンボル:.send ld:0711-224警告:シンボルが重複しています:.nrecvmsg

Copyright © Windowsの知識 All Rights Reserved