在我读过的一本书中,作者的 CPU 是 32 位的。我的是 64 位的。我在终端中运行 NASM 汇编程序:
nasm -f elf -g -F stabs asmwork/eatsyscall.asm
然后我运行链接器:
ld -o eatsyscall eatsyscall.o
返回:
ld: 输入文件的 i386 架构eatsyscall.o
与 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
?
更新
为了运行调试器,我使用了kdbg program
和kdbg ./program
。我要调试的可执行文件名为program
,它位于 文件夹中asmwork
。当我的工作目录位于该文件夹中时,我写入ls -l
并获得了有关该文件的以下信息:
-rwxrwxr-x 1 user user 1304 יול 24 17:56 program
答案1
我发现这个问题已经过时了。然而,它还没有得到答复,而且浏览量很大,因此……
我读了一些答案,上面说我需要使用“elf64”(不是书中所说的)。
这本书实际上是关于使用汇编语言为英特尔 32 位 x86 CPU 编程的,这一点在整本书中都明确说明,在我见过的所有营销文献中也是如此。您需要注意 IA-32 和 x86-64 架构之间的细微差别。如果您使用的是 x86-64 PC,那么文中给出的一些示例可能需要稍微调整一下。
除了更改elf
为之外,用替换elf64
也是明智之举,因为根据我的经验,在 x86-64 中汇编程序并不完全兼容; stabs 将是与 IA-32 Linux 一起使用的更合适的格式。stabs
dwarf
stabs
再次,您需要自行判断文中给出的示例在哪些方面需要根据技术的变化进行调整。
nasm -f elf -g -F stabs eatsyscall.asm
变成...........
nasm -f elf64 -g -F dwarf eatsyscall.asm
这应该可以成功地将您的源代码编译成与 x86-64 兼容的目标代码文件。......................................................................................................................................................
使用elf
格式而不是elf64
,将汇编一个x86
目标代码文件。然后,您可以使用以下命令创建 32 位可执行文件:
ld -m elf_i386 -o executablename objectfilename.o
选项-m
用于模拟(请参阅ld
手册页)。在这里,您可以从可用的架构中选择所需的架构。使用使我们能够在 x86-64 机器上-m elf_i386
创建可执行文件。i386
您可以使用选项-V
来获取可用架构的列表;请参阅手册页以获取完整详细信息。
...........................................................................
我在终端中运行“kdbg eatsyscall.o”。它打开 Kdbg 软件和 Kdbg:程序输出
您需要将可执行文件加载到调试器中,而不是像上面那样加载目标代码文件。当您通过链接器运行目标模块时,您已经创建了这个可执行文件(假设它是成功的);如您的问题所述。
你主要关心的是警告在输出终端窗口中。
解决方案可以在手动的。我将在这里重现该解决方案,以防将来 URL 失效。
首次使用 KDbg 调试程序时,
不会使用程序输出窗口。原因是 KDbg 无法知道程序是否需要复杂的终端仿真或是否需要通过终端输入。因此,默认情况下使用终端仿真程序。为了将输出重定向到输出窗口,您必须执行以下操作:
- 通过选择“设置”|“此程序”打开“设置”对话框。
- 切换到“输出”选项卡。
- 选择仅输出、简单终端模拟并单击确定。
- 通过从文件|最近>可执行文件中的列表中选择该程序来重新加载。