首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么不能将二进制文件的输出重定向到文件?

为什么不能将二进制文件的输出重定向到文件?
EN

Stack Overflow用户
提问于 2020-07-12 20:46:43
回答 1查看 114关注 0票数 1

我有个奇怪的问题

代码语言:javascript
运行
复制
➜  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源代码:

代码语言:javascript
运行
复制
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

汇编:

代码语言:javascript
运行
复制
nasm -f macho64 Colleen.asm
clang -nostartfiles -arch x86_64 Colleen.o -o Colleen

Linux elf64源代码

代码语言:javascript
运行
复制
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

汇编:

代码语言:javascript
运行
复制
nasm -f elf64 Colleen.asm
gcc -no-pie -nostartfiles Colleen.o -o Colleen

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-12 21:02:16

退出程序的正确方法是使用调用退出libc函数,而不是使用原始syscall。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62866295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档