1
0
mirror of https://github.com/upx/upx synced 2025-09-28 19:06:07 +08:00

Print failed syscalls to stderr

modified:   stub/src/amd64-darwin.macho-fold.S
This commit is contained in:
John Reiser 2018-09-22 12:09:22 -07:00
parent 0051dfc84f
commit b259b0ca28

View File

@ -122,36 +122,58 @@ mmap: .globl mmap
read: .globl read
mov $SYS_read,%al
push %r9; push %r8; push %rcx; push %rdx; push %rsi; push %rdi
movzbl %al,%eax; push %rax // save SYS_nnn for error diagnosis
or $SYSBASE,%eax
mov %rcx,%r10
syscall // .byte 0x0f,0x05
#define DEBUG 0
#if !DEBUG //{
jc sysfail
pop %rcx // toss SYS_nnn
add $7*8,%rsp // SYS_nnn, 6 args
ret
#endif //}
sysfail: // syscall failed: write hex error code on stderr
mov %rax,%rdx
pop %rax // SYS_nnn
push %rdi; push %rsi
push %rdx // retval
DFRAME=0x100
sysfail:
pushf
push %rax // retval
push %rdi; push %rsi // registers used
push %rbp; mov %rsp,%rbp
cmpl $SYS_write,5*8+0*8(%rbp); je ignore_WRITE
sub $DFRAME,%rsp // alloca
sub $0x70,%rsp // alloca
mov %rsp,%rdi // output ptr
call pr_hex; movb $'=',%al; stosb
movq 0x70(%rsp),%rax // retval
call pr_hex; movb $'\n',%al; stosb
movb $'\n',%al; stosb
movb $'*',%al; stosb
mov 3*8(%rbp),%rax; call pr_hex; movb $'=',%al; stosb // retval
mov 5*8+0*8(%rbp),%rax; call pr_hex; movb $'(',%al; stosb // SYS_nnn
mov 5*8+1*8(%rbp),%rax; call pr_hex; movb $',',%al; stosb // arg1
mov 5*8+2*8(%rbp),%rax; call pr_hex; movb $',',%al; stosb // arg2
mov 5*8+3*8(%rbp),%rax; call pr_hex; movb $',',%al; stosb // arg3
mov 5*8+4*8(%rbp),%rax; call pr_hex; movb $',',%al; stosb // arg4
mov 5*8+5*8(%rbp),%rax; call pr_hex; movb $',',%al; stosb // arg5
mov 5*8+6*8(%rbp),%rax; call pr_hex; movb $')',%al; stosb // arg6
movb $'\n',%al; stosb
mov %rdi,%rdx
sub %rsp,%rdx // len
mov %rsp,%rsi // ptr
mov $2,%edi // FD_STDERR
mov $SYS_write+SYSBASE,%eax
syscall
add $0x70,%rsp
pop %rcx // toss retval
pop %rsi; pop %rdi
add $DFRAME,%rsp
ignore_WRITE:
pop %rbp; pop %rsi; pop %rdi
pop %rax // retval
popf
lea 7*8(%rsp),%rsp // SYS_nnn, args
jnc sysOK
or $~0,%rax //mov errno,eax
sysOK:
ret
pr_hex: