linux - 为什么我不能将二进制文件的输出重定向到文件?
问题描述
我有一个奇怪的问题
➜ ASM git:(master) ✗ ./Colleen
DEFAULT REL
SECTION .text
global _main
extern _printf
_main:
push rbx
lea rdi, [code]
mov rsi, 10
mov rdx, 34
lea rcx, [code]
xor rax, rax
call _printf
quit:
mov eax, 0x2000001
xor edi, edi
syscall ;end
code: "DEFAULT REL%1$cSECTION .text%1$cglobal _main%1$cextern _printf%1$c_main:%1$c push rbx%1$c lea rdi, [code]%1$c mov rsi, 10%1$c mov rdx, 34%1$c lea rcx, [code]%1$c xor rax, rax%1$c call _printf%1$cquit:%1$c mov eax, 0x2000001%1$c xor edi, edi%1$c syscall ;end%1$c%1$ccode: %2$c%3$s%2$c, 0%1$c", 0
➜ ASM git:(master) ✗ ./Colleen > a
➜ ASM git:(master) ✗ cat a
➜ ASM git:(master) ✗
似乎标准输出无法重定向到文件。输出由一个简单的 printf 生成,任何其他方式生成的输出都可以正常工作,只是我的程序集有问题。我在 Debian 上做了同样的事情,但我得到了相同的结果。
macOS 源代码:
DEFAULT REL
SECTION .text
global _main
extern _printf
_main:
push rbx
lea rdi, [code]
mov rsi, 10
mov rdx, 34
lea rcx, [code]
xor rax, rax
call _printf
quit:
mov eax, 0x2000001
xor edi, edi
syscall ;end
code: db "DEFAULT REL%1$cSECTION .text%1$cglobal _main%1$cextern _printf%1$c_main:%1$c push rbx%1$c lea rdi, [code]%1$c mov rsi, 10%1$c mov rdx, 34%1$c lea rcx, [code]%1$c xor rax, rax%1$c call _printf%1$cquit:%1$c mov eax, 0x2000001%1$c xor edi, edi%1$c syscall ;end%1$c%1$ccode: %2$c%3$s%2$c, 0%1$c", 0
编译:
nasm -f macho64 Colleen.asm
clang -nostartfiles -arch x86_64 Colleen.o -o Colleen
Linux elf64源代码
DEFAULT REL
SECTION .rodata
code: db "DEFAULT REL%1$cSECTION .rodata%1$ccode: db %2$c%3$s%2$c%1$c%1$cSECTION .text%1$cextern printf%1$cglobal _start%1$c_start:%1$c mov edi, code%1$c mov esi, 10%1$c mov edx, 34%1$c mov ecx, code%1$c xor eax, eax%1$c call printf%1$c%1$c mov eax, 60%1$c xor edi, edi%1$c syscall ;end%1$c"
SECTION .text
extern printf
global _start
_start:
mov edi, code
mov esi, 10
mov edx, 34
mov ecx, code
xor eax, eax
call printf
mov eax, 60
xor edi, edi
syscall ;end
编译:
nasm -f elf64 Colleen.asm
gcc -no-pie -nostartfiles Colleen.o -o Colleen
感谢您的帮助 !
解决方案
退出程序的正确方法是使用调用退出 libc 函数而不是原始系统调用
推荐阅读
- ios - Xcode 10:图像集“customloading”引用文件“mygif.gif”,但该文件没有有效的扩展名
- c++ - Xcode 中的错误:线程 1:EXC_BAD_ACCESS(代码=1,地址=0xe8)
- vba - 更改 MS Word 宏中选定文本的字体
- twitter-bootstrap - 引导响应中的长文章问题
- php - Laravel Eloquent 加载缓慢
- r - 如何将 PubMed 中的 Mesh 写入数据框
- ios - Framework7 - Cordova - 输入键盘在 iOS 上不起作用
- algorithm - 合并K个排序的链表,为什么复杂度是O(N * K * K),而不是O(N * K)
- c++ - 如何将类中的类写入/读取到二进制文件C++
- bash - 解析 iw wlan0 站转储输出