- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下代码
.data
result: .byte 1
.lcomm input 1
.lcomm cha 2
.text
(some other code, syscalls)
起初一切都很好。当调用系统调用(例如读取)时,标签“结果”处的值更改为一些随机垃圾值。
谁知道怎么回事?
附言环境Debian x86_64 最新在虚拟机中运行使用 as -g ld emacs make latest
-----编辑-----
(continue)
.global _start
_start:
mov $3,%rax
mov $0,%rbx
mov $input,%rcx
mov $1,%rdx
int $0x80
(sys_exit)
'input'的值被正确更改,但'result'的值也更改为随机值
int $0x80
最佳答案
您正在查看从 result
开始的 4 个字节,其中包括作为第二个或第三个字节的 input
。 (这就是为什么值会增加 256 或 65536 的倍数,如果您 print (char)result
,则低字节 = 1)。如果您使用 p/x
打印为十六进制,这会更明显。
当没有调试信息时,GDB 对 print result
的默认行为是假设 int
。现在,由于像这样的用户错误,在 Arch Linux 上使用 gdb
8.1,print result
说 'result' 具有未知类型;将其转换为其声明的类型
GAS + ld
出乎意料地(无论如何对我来说)将 BSS 和数据段合并到一页中,因此即使您将变量放在您希望处理的不同部分中,您的变量也是相邻的不同的。 (BSS 由匿名归零页面支持,数据由文件的私有(private)读写映射支持)。
使用 gcc -nostdlib -no-pie test.S
构建后,我得到:
(gdb) p &result
$1 = (<data variable, no debug info> *) 0x600126
(gdb) p &input
$2 = (<data variable, no debug info> *) 0x600128 <input>
与使用 .section .bss
和手动保留空间不同,.lcomm
可以根据需要自由填充。大概是为了对齐,也许在这里 BSS 从 8 字节边界开始。当我使用 clang
构建时,我在 result
之后的字节中得到了 input
(在不同的地址)。
我通过添加带有 .lcomm arr, 888332
的大型数组进行了调查。一旦我意识到它没有在可执行文件中存储 BSS 的文字零,我就使用 readelf -a a.out
进一步检查:
(相关:What's the difference of section and segment in ELF file format)
...
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x0000000000000126 0x0000000000000126 R E 0x200000
LOAD 0x0000000000000126 0x0000000000600126 0x0000000000600126
0x0000000000000001 0x00000000000d8e1a RW 0x200000
NOTE 0x00000000000000e8 0x00000000004000e8 0x00000000004000e8
0x0000000000000024 0x0000000000000024 R 0x4
Section to Segment mapping:
Segment Sections...
00 .note.gnu.build-id .text
01 .data .bss
02 .note.gnu.build-id
...
是的,.data
和 .bss
部分在同一个 ELF 段中结束。
我认为这里发生的事情是 ELF 元数据表示要映射从 virt addr 0x600126
开始的 0xd8e1a
字节(归零页面)的 MemSize。 从文件中的偏移量 0x126
加载 1 个字节到虚拟地址 0x600126
。
因此,ELF 程序加载器必须将文件中的数据复制到支持 BSS 和 .data
部分的其他清零页面,而不仅仅是一个 mmap。
它可能是一个更大的 .data
部分,链接器需要它来决定使用单独的段。
关于linux - Gnu 汇编程序 .data 部分值在系统调用后损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50583564/
我必须在操作后写入寄存器的目的地和值。 斜体字的字段是我写的。粗体字段(如说明)由我的教授编写。 我曾尝试填写所有字段,但不确定答案。 如果你能告诉我哪里出了问题,我会很高兴,谢谢! :) 最佳答案
bios 中断函数 21h (ah = 1h) 应该从标准输入中读取一个字符并回显它。 我的阅读功能: mov ah, 1h int 21h 所以,如果我按下一个键,它会意识到这一点,
是否有 actionscript 3 的汇编器?类似于 Flasm,但用于 AS3(flasm 是 AS2)。我想将 AS3 程序集编译为独立的 SWF,或将其注入(inject)现有的 SWF。 我
我的汇编代码在调用 xbegin 时引发非法指令。 有什么问题吗? 这是我的代码。 主.c if ( rtm_begin() == 0 ) { //do something. } rtm.S
有人可以用英语解释什么是汇编程序中的相对跳转吗? 最佳答案 它是一个 OP 代码,其操作数将导致执行跳转到相对于当前地址的地址。操作数的值是 偏移 . 假设相对跳转指令保存在地址 0x0005 中,操
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我正在尝试学习 Assembly,并将其用于 64 位。我想用 C 语言编译内联汇编程序,但每次都会出错。 #include int main() { __asm__ ( "mov %rdx, 10
我编写了一个 SIC 汇编程序,除了 I/O 方面外,一切似乎都运行良好。 我已经将目标代码加载到内存中(将 char 格式转换为机器表示形式),但是当我调用 SICRun();执行代码时,我收到一条
我正在学习汇编程序(Nasm、Linux、Ubuntu 16.4、x86_64)并在使用 sys_time 调用时出现问题 (mov eax, 13)。 section .bss time:
在汇编器中: .globl _test _test: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax pushl %eax call printf popl
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在阅读杰夫的精彩著作 assembly step by step ,我在第 8 章中展示了一个汇编程序示例,该程序以这种方式从用户那里获取文件: SECTION .bss ;
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 1年前关闭。 锁定。这个问题及其答案是loc
我有一个简短的问题。我正在使用 MARS 汇编程序(在 MIPS 指令集中编程)并且我有两个 MIPS 文件。一个文件包含我要运行的主要方法,它调用另一个文件中的函数。我的函数前面有 .globl 指
我必须回答以下关于 6502 汇编语言的问题: “在堆栈上,有以下值(顶部元素在前):0x01, 0x02, 0x03, 0x04, 0x05, 0x06地址 0xc000 是指令 jsr 0xABC
我实际上是在学习汇编,我用的是 Gas,但问题是: 1) 我只知道 Intel 语法,我在一个页面上看到使用 intel 语法的 Gas 在某些情况下优化得不是很好。这是正确的还是我错了?我说的是这个
在汇编程序中,我可以使用 MUL 命令并获得 64 位结果 EAX:EDX,我怎样才能在 C 中做同样的事情? http://siyobik.info/index.php?module=x86&id=
作为编译器项目的一部分,我必须为 x86 编写 GNU 汇编程序代码来比较浮点值。我试图找到有关如何在线执行此操作的资源,据我所知,它是这样工作的: 假设我要比较的两个值是浮点堆栈上的唯一值,那么 f
我有一个用 2 个不同的编译器编译的程序: GCC 3.4.4 PowerPC 交叉编译器 GCC 4.8.1 MinGW 编译器 在程序中,我使用了汇编程序指令 .weak 。文档说: 使具有弱绑定
我写了一个简单的 ASM 程序,但 sys_write 没有给出任何输出。我想我对指向 %ecx 的指针犯了一个错误,并且 sys_write 无法访问该字符串 - 但到目前为止我还没有发现我的错误。
我是一名优秀的程序员,十分优秀!