写入系统调用中 strace 输出中的混合整数和字符串
Mixed integer and string in strace output in write syscall
我想从 32 位程序集调用写系统调用,我现在使用的代码:
.section .rodata # read-only data
msg:
.ascii "hello" # char array called "msg" (no null character)
len:
.long 5 # length of "msg"
.section .text # actual runnable code
.globl _start
.type _start, @function
_start:
movl , %eax # syscall number into eax (4 is write)
movl , %ebx # argument number 1 into ebx (stdout)
movl $msg, %ecx # argument number 2 into ecx
movl len, %edx # argument number 3 into edx
int [=10=]x80
movl , %eax # syscall number into eax (1 is exit)
movl [=10=], %ebx # argument number 1 into ebx (exit code)
int [=10=]x80
为了编译它,我首先调用 GNU 汇编器,然后调用链接器:
as --32 main.s -o main.o
ld -m elf_i386 main.o -o main
它编译并正常工作,将字符串“hello”打印到控制台,但是当我使用 strace 来“查看”写入发生时,我得到以下输出:
execve("./main", ["./main"], [/* 86 vars */]) = 0
strace: [ Process PID=22529 runs in 32 bit mode. ]
write(1, "hello", 5hello) = 5
exit(0) = ?
+++ exited with 0 +++
我想知道是什么导致第三个参数是 5hello 而不是 5。
没什么,里面的hello
是你程序的实际输出。这是正在发生的事情:
- strace 拦截写入系统调用
- strace 打印调用名称和参数:
write(1, "hello", 5
。请注意,这转到 stderr
。由于某种原因,它还没有打印结束 )
。
write
系统调用被执行,因此 hello
被打印到 stdout
。
- strace 再次需要获得控制权,以便它可以打印 return 值,它与给出
) = 5
. 的右括号一起打印
在你的例子中,stdout
和 stderr
指的是同一个终端。重定向 strace 或您的代码的输出,这样它们就不会散布。
我想从 32 位程序集调用写系统调用,我现在使用的代码:
.section .rodata # read-only data
msg:
.ascii "hello" # char array called "msg" (no null character)
len:
.long 5 # length of "msg"
.section .text # actual runnable code
.globl _start
.type _start, @function
_start:
movl , %eax # syscall number into eax (4 is write)
movl , %ebx # argument number 1 into ebx (stdout)
movl $msg, %ecx # argument number 2 into ecx
movl len, %edx # argument number 3 into edx
int [=10=]x80
movl , %eax # syscall number into eax (1 is exit)
movl [=10=], %ebx # argument number 1 into ebx (exit code)
int [=10=]x80
为了编译它,我首先调用 GNU 汇编器,然后调用链接器:
as --32 main.s -o main.o
ld -m elf_i386 main.o -o main
它编译并正常工作,将字符串“hello”打印到控制台,但是当我使用 strace 来“查看”写入发生时,我得到以下输出:
execve("./main", ["./main"], [/* 86 vars */]) = 0
strace: [ Process PID=22529 runs in 32 bit mode. ]
write(1, "hello", 5hello) = 5
exit(0) = ?
+++ exited with 0 +++
我想知道是什么导致第三个参数是 5hello 而不是 5。
没什么,里面的hello
是你程序的实际输出。这是正在发生的事情:
- strace 拦截写入系统调用
- strace 打印调用名称和参数:
write(1, "hello", 5
。请注意,这转到stderr
。由于某种原因,它还没有打印结束)
。 write
系统调用被执行,因此hello
被打印到stdout
。- strace 再次需要获得控制权,以便它可以打印 return 值,它与给出
) = 5
. 的右括号一起打印
在你的例子中,stdout
和 stderr
指的是同一个终端。重定向 strace 或您的代码的输出,这样它们就不会散布。