Ubuntuコンピュータでコンパイルする小さなC ++プログラムがあります。プログラムは同じシステムでうまく実行されますが、別のLinuxシステムでコピーして実行しようとすると印刷されます。
./prog1: 対応するファイルやディレクトリはありません。
さらなる調査により、ターゲットLinuxシステムで実行されているカーネルでVDSO(linux-vdso.so.1)サポートが有効になっていないことに気づきました。
これは私のLinuxシステム上のプログラムのldd出力です。
linux-vdso.so.1 => (0x00007fffda425000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6ce9114000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6ce8efe000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6ce8b38000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6ce8832000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6ce9432000)
私はUbuntuコンピュータでコードをコンパイルしてターゲットで実行する方法を知りたいと思います。
______________________________-
新しい編集者
バイナリは実行用としてマークされているため、これは問題ではありません。 VDSOはターゲットカーネルがサポートしていることがわかったので、間違いなく問題はありません。
これで、ターゲットカーネルと私のUbuntu PCにインストールされているカーネルの間に違いがあることがわかりました。
ターゲットから…剥がれた
Ubuntu ----- prog1:ELF 64ビットLSB実行可能ファイル、x86-64、バージョン1(SYSV)、動的リンク(共有ライブラリを使用)、GNU / Linux 2.6.24用、BuildID [sha1] = 4ab095886f476674a7bf30c11da59 , not 剥がれた
それでは、より高いカーネルバージョン(例:2.6.32)でコードをコンパイルする必要がありますか?
答え1
linux-vdso.so は一般的な共有ライブラリではありません。完全なコンテキストの切り替えなしにいくつかのシステムコールを提供し、通常はシステムコールを簡素化するために、カーネルが各プロセスのアドレス空間に自動的にマップされる仮想ライブラリです。マンページ(オンライン)で詳細を読むことができます。ここ)。ファイルからロードされていないため、パスはldd
表示されませんが、マップされたアドレスが表示されるため、正しくロードされていることを確認できます。
すべてのライブラリが見つかったため、ファイルがchmod +x
まったく実行可能()としてマークされていないのが最も可能性の高い原因です。