1. ホーム

プログラムを実行した結果: bash: . /xxx : そのようなファイルまたはディレクトリはありません

2022-03-01 22:47:13

debianシステム(32ビット)でプログラムをコンパイルしました(クロスコンパイルツールチェーンは使用していません)。

uname -a



Linux Debian 3.10.90-2-686 #7 SMP Fri Oct 9 20:26:23 CST 2015 i686 GNU/Linux

root@# ldd --バージョン



ldd (Debian EGLIBC 2.11.2-10) 2.11.2



ルート# gcc --バージョン



gcc (Debian 4.3.2-1.1) 4.3.2





そして、仮想マシンubuntuに載せて実行したい(現在は間違いなく実行されていないが、どんなエラーが発生するか)。

 uname -a



Linux ls-virtual-machine 4.2.0-42-generic #49~14.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 GNU/Linux

ldd --バージョン



ldd (Ubuntu EGLIBC 2.19-0ubuntu6.14) 2.19

 gcc --バージョン



gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4

ここで質問です。

実行すると、次のようなエラーが発生します: bash: . /xxx : そのようなファイルまたはディレクトリはありません (xxx は私のプログラムの名前です)

不思議なことに、プログラムファイルが見つからないとプロンプトが出るので、学習の機会を与えてくれます。

そのためには、プログラムの実行過程を理解する必要があります。プログラムが実行される前に、まず必要なダイナミックライブラリをロードする必要があるのです。 動的リンクが必要なアプリケーションがオペレーティングシステムによってロードされるとき、システムは必要なすべての動的ライブラリファイルを探してロードする必要があります。Linuxでは、これはld-linux.so.2によって行われ、アプリケーションが依存する必要がある動的ライブラリを確認するためにlddコマンドを使用することができます。 

        linux-gate.so.1 => (0xb776b000)



        libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb774c000)



        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7606000)です。



        /lib/ld-linux.so.2 (0xb776c000)





readelf -l xxx.

Elfファイルの種類はEXEC(実行ファイル)です。



エントリーポイント 0x8049580



オフセット52から始まる7つのプログラムヘッダーがあります。







プログラムヘッダー



  タイプ オフセット VirtAddr PhysAddr FileSiz MemSiz Flg Align



  PHDR 0x000034 0x08048034 0x08048034 0x000e0 0x000e0 R E 0x4



  INTERP 0x000114 0x08048114 0x00013 0x00013 R 0x1



      [プログラムインタプリタを要求している:/lib/ld-linux.so.2]。



  LOAD 0x000000 0x08048000 0x08048000 0x0b684 0x0b684 R E 0x1000



  LOAD 0x00b684 0x08054684 0x006ac 0x02288 RW 0x1000



  DYNAMIC 0x00b698 0x08054698 0x08054698 0x000d8 0x000d8 RW 0x4



  NOTE 0x000128 0x08048128 0x08048128 0x00020 0x00020 R 0x4



  GNU_STACK 0x000000 0x0000000000 0x00000 0x00000 RW 0x4



プログラム起動時に ld-linux.so.2 ローダーは、プログラムのエントリに制御を渡す前に、すべてのダイナミックライブラリをロードするために使用されます。

ダイナミックライブラリの仕組みについては、https://blog.csdn.net/hudaliquan/article/details/50055493 を参照してください。

Ubuntuでは見当たりません /lib/ld-linux.so.2 を取得しました。 ld-linux.so.2がdebianのlibsからubuntuに(以降 ld-linux.so.2 はソフトリンクであり、実際の

<スパン <スパン (コピーされたファイルはld-2.11.2.soで、その後ubuntuでld-2.11.2.soのソフト接続が手動で作成されます)

<スパン その後、再度プログラムを実行すると、まあ、もうbash: . /xxx : No such file or directory errorとなり、多少は効果があるようですが、ほんの少ししか効果がないようです。

<スパン プログラムはまだ実行できません。

<スパン bash: .xxx Permission deny というエラーでプログラムが実行されます。  時間の都合上、詳細は後日とさせていただきます。