- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试手动编写尽可能小的 x86_64 ELF hello world 程序,但在尝试运行它时收到段错误。
gdb 说:在启动过程中程序以信号 SIGSEGV 终止,段错误。
这是十六进制转储:
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
00000010: 0200 3e00 0100 0000 7800 0000 0000 0000 ..>.....x.......
00000020: 4000 0000 0000 0000 0000 0000 0000 0000 @...............
00000030: 0000 0000 4000 3800 0100 0000 0000 0000 ....@.8.........
00000040: 0100 0000 0500 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 3100 0000 0000 0000 3100 0000 0000 0000 1.......1.......
00000070: 0200 0000 0000 0000 b801 0000 00bf 0100 ................
00000080: 0000 be9a 0000 00ba 0a00 0000 0f05 b83c ..."...........<
00000090: 0000 00bf 0000 0000 0f05 4865 6c6c 6f2c ..........Hello,
000000a0: 2057 6f72 6c64 210a 00 World!..
这是 readelf -a 的输出:
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x78
Start of program headers: 64 (bytes into file)
Start of section headers: 0 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 1
Size of section headers: 0 (bytes)
Number of section headers: 0
Section header string table index: 0
There are no sections in this file.
There are no section groups in this file.
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000031 0x0000000000000031 R E 0x2
There is no dynamic section in this file.
There are no relocations in this file.
No processor specific unwind information to decode
Dynamic symbol information is not available for displaying symbols.
No version information found in this file.
代码如下:
0xb8 0x01 0x00 0x00 0x00 /* mov %rax, 1 ; sys_write */
0xbf 0x01 0x00 0x00 0x00 /* mov %rdi, 1 ; STDOUT */
0xbe 0x9a 0x00 0x00 0x00 /* mov %rsi, 0x9a ; address of string */
0xba 0x0a 0x00 0x00 0x00 /* mov %rdi, 15 ; size of string */
0x0f 0x05 /* syscall */
0xb8 0x3c 0x00 0x00 0x00 /* mov %rax, 60 ; sys_exit */
0xbf 0x00 0x00 0x00 0x00 /* mov %rdi, 0 ; exit status */
0x0f 0x05 /* syscall */
“Hello, World!\n”字符串紧随其后。我一直在用this MOV instruction .尝试使用程序头偏移量、对齐方式和虚拟地址字段没有产生任何结果。 manpage这部分有点困惑。我还尝试将此二进制文件与用汇编语言编写的二进制文件进行比较,但我发现没有任何用处。
现在回答我的问题:您能告诉我错误是什么和/或我该如何调试这个二进制文件吗?
最佳答案
I tried to write the smallest possible x86_64 ELF hello world program by hand
您应该为您的程序提供一个源代码,以便我们修复它。
gdb says:
During startup program terminated with signal SIGSEGV
这是 GDB 告诉你它调用了 fork/execve
来创建目标程序,并期望内核通知 GDB 该程序现在可以调试了。取而代之的是,内核通知 GDB 该程序已通过 SIGSEGV
终止,还没有到达它的第一条指令。
GDB 没有预料到这一点。为什么会这样?
当内核查看您的可执行文件并说“我无法从中创建正在运行的程序”时,就会发生这种情况。
为什么会这样?因为这个 LOAD
段:
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000031 0x0000000000000031 R E 0x2
要求内核将文件中偏移量 0
的 0x31
字节映射到虚拟地址 0
。但是内核(理所当然地)拒绝了这种无意义的请求,并在从 execve
返回之前用 SIGSEGV
终止了程序。
您可能可以通过制作文件 ET_DYN
而不是 ET_EXEC
来避免这种情况——这会将您的程序头的含义从“将此段映射到 0”更改为“将此段映射到任何地方”。
您绝对可以通过保留 ET_EXEC
来避免这种情况,但将段的 .p_vaddr
和 .p_paddr
更改为类似 0x10000
.
TL;DR:您的程序和文件头必须对内核有意义,否则您将永远无法启动。
关于linux - 最小的 x86_64 Hello World ELF 二进制文件是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72930779/
Closed. This question needs details or clarity。它当前不接受答案。 想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。 去
I am learning boost-python from the Tutorial, 但是报错了,你能给我一些提示吗,谢谢! #include using namespace boost::p
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Capitalize First Char of Each Word in a String Java 编写进行以下
很抱歉这个问题的措辞有点疯狂,但我对面向代理的思维非常陌生(这些是“模式”吗?),并且对 java 来说只是稍微不那么新鲜,而且我正在努力解决感觉像非常基本的问题。 我“凭直觉”(即盲目地)做了很多这
是的,所以我正在制作一个沼泽标准 Hello world 以确保 android 正常工作。这是我第一次使用 android,所以我正在设置环境。我按照以下程序制作了程序:http://develop
我正在尝试将“Hello World”变为“World Hello”。但是代码没有按照我希望的方式正常工作。请看下面的代码: #include #include #include struct lln
例如,virt-what显示您是否在硬件虚拟化“沙箱”中运行。 如何检测您是否在 ARM "TrustZone"沙箱中运行? 最佳答案 信任专区 可能和你想的不一样。有一个连续的模式。从“受信任功能的
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
如何使用 CSS 将字符串“Hello world I am Jack”反转为“Jack am I world Hello”? 例如: Hello World ,我是 jack 我想知道如何使用 CS
为什么这段代码抛出 InputMismatchException ? Scanner scanner = new Scanner("hello world"); System.out.println(
require 'csv' s = "\"Hello World\"" CSV.open('output.txt', 'w') do |csv| csv << [s] end 在我的文件中,我
当我尝试这段代码时 char *a[] = {"hello", "world" }; char **p = a; char a[][10]={"hello", "world"}; 我的编译失败了,我被
为什么“第二次世界大战”没有取代“第二次世界大战”? var wha = prompt("What is?"); for (var i = 1; i < wha.length; i++) { if
我刚刚在 Windows XP 上安装了 Python 2.7.2,想学习如何编程。我使用的一些教程书籍提供了打印命令的示例,当我尝试这些命令时,我会得到不同的答案。 我希望这两个返回相同的东西 -
我卸载了android ask并重新安装到没有空格的c:\androidSdktools。所以现在模拟器可以工作了,我可以看到模拟器了。 但尝试了一些“hello world”文本的代码,当我运行应用
在Swift中,下面是什么语法? let (hello, world):(String,String) = ("hello","world") print(hello) //prints "hello
在我的 url 中,我有“?msg=hello+world”,在我的操作中,它将值转换为“hello world” public ActionResult test(string msg) {
正如标题所说,我需要格式化一串文本,格式如下:“HELLO, WORLD. HOW ARE YOU?”进入“你好,世界。你好吗?”,在 iOS 中是否有任何标准方法可以做到这一点?或者有没有示例代码?
我已经开始学习 C++ 并编写了一个“Hello World”程序。当我尝试在命令提示符下运行它时,它崩溃并向我显示一条 Windows 消息“Hello World.exe 已停止工作。”。 代码:
这个问题已经有答案了: member variable string gets treated as Tuple in Python (3 个回答) 已关闭 4 年前。 我是 python 新手,正在
我是一名优秀的程序员,十分优秀!