web-dev-qa-db-ja.com

デバッガーを実行すると:「制御端末の設定に失敗しました」

私が読んだ本では、著者のCPUは32ビットでした。私のものは64ビットです。ターミナルでNASMアセンブラーを実行します:

nasm -f elf -g -F stabs asmwork/eatsyscall.asm

次に、リンカーを実行します。

ld -o eatsyscall eatsyscall.o

これは返されました:

ld:入力ファイルeatsyscall.oのi386アーキテクチャはi386:x86-64出力と互換性がありません

いくつかの答えを読んだところ、elf64を使用する必要があると書かれていました(本の説明どおりではありません)。アセンブラを実行すると、このメッセージが解決しました。

ここで、ターミナルkdbg eatsyscall.oで実行します。 KDbgソフトウェアを開き、KDbg:プログラム出力

行のブレークポイントを選択すると、通常どおり赤い丸が表示されます。 [実行]をクリックしても、矢印の赤い丸は変わりません。代わりに、KDbg:プログラム出力で、このメッセージを出力します(.oファイルの場所が出力のように表示されていません)書かれた):

warning: GDB: Failed to set controlling terminal: Operation not permitted 
/bin/bash: Permission denied 
/bin/bash: line 0: exec: cannot execute: Permission denied.

または、ある場合には、次のメッセージのみです。

warning: GDB: Failed to set controlling terminal: Operation not permitted

[設定]> [グローバルオプション]では、次のことができます。

  • GDBを呼び出す方法:gdb --fullname --nx
  • プログラム出力用のターミナル:xterm -name kdbgio -title %T -e sh -c %C

私に何ができる?許可エラーが発生するのはなぜですか?コマンドSudoに関連するものですか?


UPDATE

デバッガーを実行するには、kdbg programkdbg ./programを使用しました。デバッグする実行可能ファイルはprogramと呼ばれ、asmworkフォルダーにあります。作業ディレクトリがそのフォルダにある場合、ls -lと書くと、ファイルについて次のようになります。

-rwxrwxr-x 1 adam adam 1304 יול 24 17:56 program

This

this

this

2
Pichi Wuana

これは古いことがわかります。しかし、未回答であり、重要な意見を受けているため、…..

私はいくつかの答えを読んで、(本が言ったようにではなく) `elf64`を使う必要があると言った。

問題の本は、Intelの32ビットx86 CPU向けのアセンブリ言語でのプログラミングに関するものです。これは、全体を通して、そして私が見たマーケティング資料のいずれかに明記されています。 IA-32アーキテクチャとx86-64アーキテクチャの微妙な違いに注意する必要があります。 x86-64 PCを使用している場合、本文に記載されている例の一部を微調整する必要があるかもしれません。

elfelf64に変更することに加えて、x86でstabsを使用してプログラムをアセンブルすると、dwarfstabsに置き換えるのが賢明です。 -64は完全に互換性がありません。スタブは、IA-32 Linuxでの作業により適した形式です。

繰り返しますが、テキストで与えられた例が技術の変化に合わせて調整する必要がある場所を解読するのはあなた次第です。

nasm -f elf -g -F stabs eatsyscall.asm

になる...............

nasm -f elf64 -g -F dwarf eatsyscall.asm

これにより、ソースコードがx86-64互換のオブジェクトコードファイルに正常にコンパイルされます。 .................................................. .................................................. .................................................. .............

elf64ではなくelf形式を使用すると、x86オブジェクトコードファイルがアセンブリされます。その後、次を使用して32ビットの実行可能ファイルを作成できます。

ld -m elf_i386 -o executablename objectfilename.o

オプション-mはエミュレーション用です(ldのマニュアルページを参照してください)。ここで、使用可能なアーキテクチャから目的のアーキテクチャを選択できます。 -m elf_i386を使用すると、x86-64マシンでi386実行可能ファイルを作成できます。

オプション-Vを使用して、使用可能なアーキテクチャのリストを取得できます。詳細については、manページを参照してください。

.................................................. ............................

ターミナル `kdbg eatsyscall.o`で実行します。 KdbgソフトウェアとKdbg:プログラム出力を開きます

上記のオブジェクトコードファイルではなく、デバッガに実行可能ファイルを読み込む必要があります。リンカを介してオブジェクトモジュールを実行したときに、成功したと仮定して、この実行可能ファイルを既に作成しています。あなたの質問で述べたように。

主な関心事は、出力ターミナルウィンドウのwarningにあるようです。

手動 で解決策を探すことができます。 URLが将来失敗する場合に備えて、ここでソリューションを再現します。

プログラムがKDbgで初めてデバッグされるとき、プログラムは
出力ウィンドウは使用されません。この理由は、KDbgがプログラムに高度な端末エミュレーションが必要かどうか、または端末からの入力が必要かどうかを判断できないためです。そのため、デフォルトではターミナルエミュレータプログラムが使用されます。出力を出力ウィンドウにリダイレクトするには、次を実行する必要があります。

  1. 設定|このプログラムを選択して、設定ダイアログを開きます。
  2. [出力]タブに切り替えます。
  3. [出力のみ、単純な端末エミュレーション]を選択し、[OK]をクリックします。
  4. File | Recent> Executablesのリストからプログラムを選択して、プログラムをリロードします。
1
Andrew Hardiman