summaryrefslogtreecommitdiff
path: root/exec
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2023-05-02 16:44:46 +0800
committerPo Lu <luangruo@yahoo.com>2023-05-02 16:44:46 +0800
commitf4512cca0b996e5343ebe57511f45a29f64c4a8e (patch)
treed7eca09f5d2f3a4db3b10212c10e66e24253c046 /exec
parent5a58a6bc477f290ee0b8a6111e92df56ff538719 (diff)
downloademacs-f4512cca0b996e5343ebe57511f45a29f64c4a8e.tar.gz
Fix ps name in Android subprocesses
* exec/Makefile.in (.SUFFIXES): Include ., then `srcdir'. * exec/loader-aarch64.s (_start): * exec/loader-armeabi.s (_start): * exec/loader-mips64el.s (__start): * exec/loader-mipsel.s (__start): * exec/loader-x86.s (_start): * exec/loader-x86_64.s (_start): Get basename of opened exec file and make it the command name. Fix envp skipping on x86 and various leaks.
Diffstat (limited to 'exec')
-rw-r--r--exec/Makefile.in2
-rw-r--r--exec/loader-aarch64.s13
-rw-r--r--exec/loader-armeabi.s16
-rw-r--r--exec/loader-mips64el.s19
-rw-r--r--exec/loader-mipsel.s27
-rw-r--r--exec/loader-x86.s37
-rw-r--r--exec/loader-x86_64.s29
7 files changed, 115 insertions, 28 deletions
diff --git a/exec/Makefile.in b/exec/Makefile.in
index 365dc42e0b7..ae6bdf00415 100644
--- a/exec/Makefile.in
+++ b/exec/Makefile.in
@@ -81,7 +81,7 @@ Makefile: config.status Makefile.in
.SUFFIXES: .c .s
.c.o:
- $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEPFLAGS) -I$(srcdir) -I. $< -o $@
+ $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEPFLAGS) -I. -I$(srcdir) $< -o $@
.s.o:
$(M4) $< > $(notdir $<).s
$(AS) $(ASFLAGS) $(notdir $<).s -o $@
diff --git a/exec/loader-aarch64.s b/exec/loader-aarch64.s
index 1b99d238b92..da8ec1f4977 100644
--- a/exec/loader-aarch64.s
+++ b/exec/loader-aarch64.s
@@ -92,14 +92,27 @@ _start:
svc #0 // syscall
cmp x0, #-1 // rc < 0?
ble .perror
+ mov x19, x1 // x19 == x1
.nextc:
ldrb w2, [x1], #1 // b = *x1++
+ cmp w2, #47 // dir separator?
+ bne .nextc1 // not dir separator
+ mov x19, x1 // x19 = char past separator
+.nextc1:
cbnz w2, .nextc // b?
add x1, x1, #7 // round up x1
and x20, x1, #-8 // mask for round, set x20
tst x11, #16 // primary fd?
bne .secondary // secondary fd
mov x29, x0 // primary fd
+ mov x8, #167 // SYS_prctl
+ mov x0, #15 // PR_SET_NAME
+ mov x1, x19 // basename
+ mov x2, #0 // arg2
+ mov x3, #0 // arg3
+ mov x4, #0 // arg4
+ mov x5, #0 // arg5
+ svc #0 // syscall
b .next_action // next action
.secondary:
mov x28, x0 // secondary fd
diff --git a/exec/loader-armeabi.s b/exec/loader-armeabi.s
index 182ff11ec7a..32b2a5268d6 100644
--- a/exec/loader-armeabi.s
+++ b/exec/loader-armeabi.s
@@ -104,15 +104,27 @@ _start:
cmp r0, #-1 @ r0 <= -1?
ble .perror
add r8, r8, #4 @ r8 = start of string
+ mov r1, r8 @ r1 = r8
.nextc:
- ldrb r1, [r8], #1 @ b = *r0++
- cmp r1, #0 @ b?
+ ldrb r2, [r8], #1 @ b = *r0++
+ cmp r2, #47 @ dir separator?
+ bne .nextc1 @ not dir separator
+ mov r1, r8 @ r1 = char past separator
+.nextc1:
+ cmp r2, #0 @ b?
bne .nextc @ next character
add r8, r8, #3 @ round up r8
and r8, r8, #-4 @ mask for round, set r8
tst r11, #16 @ primary fd?
bne .secondary @ secondary fd
mov r10, r0 @ primary fd
+ mov r7, #172 @ SYS_prctl
+ mov r0, #15 @ PR_SET_NAME, r1 = name
+ mov r2, #0 @ arg2
+ mov r3, #0 @ arg3
+ mov r4, #0 @ arg4
+ mov r5, #0 @ arg5
+ swi #0 @ syscall
b .next_action @ next action
.secondary:
mov r14, r0 @ secondary fd
diff --git a/exec/loader-mips64el.s b/exec/loader-mips64el.s
index 73dc8c63fe8..00a2765a9b6 100644
--- a/exec/loader-mips64el.s
+++ b/exec/loader-mips64el.s
@@ -123,10 +123,16 @@ dnl syscall # syscall
bne $a3, $zero, .perror # perror
nop # delay slot
DADDI2( $s0, 8) # start of string
+ move $t3, $s0 # t3 = s0
.nextc:
lb $t0, ($s0) # load byte
DADDI2( $s0, 1) # s0++
- bne $t0, $zero, .nextc # next character?
+ li $t1, 47 # directory separator `/'
+ bne $t0, $t1, .nextc1 # is separator char?
+ nop # delay slot
+ move $t3, $s0 # t3 = char past separator
+.nextc1:
+ bnez $t0, .nextc # next character?
nop # delay slot
DADDI2( $s0, 7) # adjust for round
li $t2, -8 # t2 = -8
@@ -136,8 +142,19 @@ dnl syscall # syscall
beqz $t0, .primary # primary fd?
nop # delay slot
DADDI2( $t1, 8) # address of secondary fd
+ sd $v0, ($t1) # store fd
+ j .next_action # next action
+ nop # delay slot
.primary:
sd $v0, ($t1) # store fd
+ li $v0, 5153 # SYS_prctl
+ li $a0, 15 # PR_SET_NAME
+ move $a1, $t3 # char past separator
+ move $a2, $zero # a2
+ move $a3, $zero # a3
+ move $a4, $zero # a4
+ move $a5, $zero # a5
+ syscall # syscall
j .next_action # next action
nop # delay slot
.perror:
diff --git a/exec/loader-mipsel.s b/exec/loader-mipsel.s
index 2ad9d97dfed..8537a0d2fe2 100644
--- a/exec/loader-mipsel.s
+++ b/exec/loader-mipsel.s
@@ -24,10 +24,10 @@ include(`config-mips.m4')
.section .text
.global __start
__start:
-dnl li $v0, SYSCALL_nanosleep # SYS_nanosleep
-dnl la $a0, .timespec # rqtp
-dnl li $a1, 0 # rmtp
-dnl syscall # syscall
+ li $v0, SYSCALL_nanosleep # SYS_nanosleep
+ la $a0, .timespec # rqtp
+ li $a1, 0 # rmtp
+ syscall # syscall
lw $s6, ($sp) # original stack pointer
addi $s0, $sp, 8 # start of load area
addi $sp, -8 # primary fd, secondary fd
@@ -121,10 +121,16 @@ RESTORE() # delay slot, restore sp
syscall # syscall
bne $a3, $zero, .perror # perror
addi $s0, $s0, 4 # start of string, delay slot
+ move $t3, $s0 # t3 = char past separator
.nextc:
lb $t0, ($s0) # load byte
addi $s0, $s0, 1 # s0++
- bne $t0, $zero, .nextc # next character?
+ li $t1, 47 # directory separator `/'
+ bne $t0, $t1, .nextc1 # is separator char?
+ nop # delay slot
+ move $t3, $s0 # t3 = char past separator
+.nextc1:
+ bnez $t0, .nextc # next character?
nop # delay slot
addi $s0, $s0, 3 # adjust for round
li $t2, -4 # t2 = -4
@@ -133,8 +139,17 @@ RESTORE() # delay slot, restore sp
beqz $t0, .primary # primary fd?
move $t0, $sp # address of primary fd, delay slot
addi $t0, $t0, 4 # address of secondary fd
+ j .next_action # next action
.primary:
- sw $v0, ($t0) # store fd
+ sw $v0, ($t0) # store fd, delay slot
+ li $v0, SYSCALL_prctl # SYS_prctl
+ li $a0, 15 # PR_SET_NAME
+ move $a1, $t3 # name
+ move $a2, $zero # arg1
+ move $a3, $zero # arg2
+SYSCALL(`$a2',`$a2',`$a2',`$a2') # syscall args
+ syscall # syscall
+RESTORE() # restore sp
j .next_action # next action
nop # delay slot
.perror:
diff --git a/exec/loader-x86.s b/exec/loader-x86.s
index ee69b26d78b..6329e7f33b1 100644
--- a/exec/loader-x86.s
+++ b/exec/loader-x86.s
@@ -21,10 +21,10 @@ CC along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
.section .text
.global _start
_start:
- #movl $162, %eax CC SYS_nanosleep
- #leal timespec, %ebx
- #xorl %ecx, %ecx
- #int $0x80
+dnl movl $162, %eax CC SYS_nanosleep
+dnl leal timespec, %ebx
+dnl xorl %ecx, %ecx
+dnl int $0x80
leal 8(%esp), %ebp CC ebp = start of load area
subl $8, %esp CC (%esp) = primary fd, 4(%esp) = secondary fd
movl $-1, 4(%esp)
@@ -102,10 +102,16 @@ _start:
jle .perror
movl %ebp, %esi CC (esi) = original action number
popl %ebp CC ebp = start of string
+ movl %ebp, %ecx CC char past separator
decl %ebp
.nextc:
incl %ebp
- cmpb $0, (%ebp) CC *ebp == 0?
+ movb (%ebp), %dl CC dl = *ebp
+ cmpb $47, %dl CC dl == '\?'?
+ jne .nextc1
+ leal 1(%ebp), %ecx CC ecx = char past separator
+.nextc1:
+ cmpb $0, %dl CC dl == 0?
jne .nextc
addl $4, %ebp CC adjust past ebp prior to rounding
andl $-4, %ebp CC round ebp up to the next long
@@ -114,7 +120,16 @@ _start:
movl %eax, 4(%esp) CC secondary fd = eax
jmp .next_action
.primary:
- movl %eax, (%esp) CC primary fd = eax
+ pushl %ebp
+ xorl %esi, %esi CC arg3
+ movl %eax, 4(%esp) CC primary fd = eax
+ xorl %edx, %edx CC arg2
+ movl $15, %ebx CC PR_SET_NAME, arg1 = ecx
+ xorl %edi, %edi CC arg4
+ movl $172, %eax CC SYS_prctl
+ xorl %ebp, %ebp CC arg5
+ int $0x80 CC syscall
+ popl %ebp
jmp .next_action
.perror:
movl %eax, %ebx
@@ -127,7 +142,7 @@ _start:
leal 8(%ecx, %esi, 4), %ecx CC ecx = start of environ
.skip_environ:
movl (%ecx), %esi CC envp[N]
- subl $4, %ecx
+ addl $4, %ecx
testl %esi, %esi CC envp[n] ?
jnz .skip_environ CC otherwise, esi is now at the start of auxv
.one_auxv:
@@ -168,12 +183,12 @@ _start:
jmp .one_auxv
.cleanup:
movl $6, %eax CC SYS_close
- cmpl $1, -4(%esp) CC see if interpreter fd is set
- jne .cleanup_1
- movl -4(%esp), %ebx
+ cmpl $-1, 4(%esp) CC see if interpreter fd is set
+ je .cleanup_1
+ movl 4(%esp), %ebx
int $0x80
-.cleanup_1:
movl $6, %eax CC SYS_close
+.cleanup_1:
movl (%esp), %ebx
int $0x80
.enter:
diff --git a/exec/loader-x86_64.s b/exec/loader-x86_64.s
index 07227d38396..acba609b202 100644
--- a/exec/loader-x86_64.s
+++ b/exec/loader-x86_64.s
@@ -21,10 +21,10 @@ CC along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
.section .text
.global _start
_start:
- #movq $35, %rax CC SYS_nanosleep
- #leaq timespec(%rip), %rdi
- #xorq %rsi, %rsi
- #syscall
+dnl movq $35, %rax CC SYS_nanosleep
+dnl leaq timespec(%rip), %rdi
+dnl xorq %rsi, %rsi
+dnl syscall
popq %r13 CC original SP
popq %r15 CC size of load area.
movq $-1, %r12 CC r12 is the interpreter fd
@@ -87,9 +87,16 @@ _start:
jle .perror
movq %rdi, %rsp CC rsp = start of string
subq $1, %rsp
+ movq %rsp, %r14 CC r14 = start of string
.nextc:
addq $1, %rsp
- cmpb $0, (%rsp) CC *rsp == 0?
+ movb (%rsp), %dil CC rdi = *rsp
+ cmpb $47, %dil CC *rsp == '/'?
+ jne .nextc1
+ movq %rsp, %r14 CC r14 = rsp
+ addq $1, %r14 CC r14 = char past separator
+.nextc1:
+ cmpb $0, %dil CC *rsp == 0?
jne .nextc
addq $8, %rsp CC adjust past rsp prior to rounding
andq $-8, %rsp CC round rsp up to the next quad
@@ -99,6 +106,14 @@ _start:
jmp .next_action
.primary:
movq %rax, %rbx CC if not, move fd to rbx
+ movq $157, %rax CC SYS_prctl
+ movq $15, %rdi CC PR_SET_NAME
+ movq %r14, %rsi CC arg1
+ xorq %rdx, %rdx CC arg2
+ xorq %r10, %r10 CC arg3
+ xorq %r8, %r8 CC arg4
+ xorq %r9, %r9 CC arg5
+ syscall
jmp .next_action
.perror:
movq %rax, %r12 CC error code
@@ -159,11 +174,11 @@ _start:
.cleanup:
movq $3, %rax CC SYS_close
cmpq $-1, %r12 CC see if interpreter fd is set
- jne .cleanup_1
+ je .cleanup_1
movq %r12, %rdi
syscall
-.cleanup_1:
movq $3, %rax CC SYS_close
+.cleanup_1:
movq %rbx, %rdi
syscall
.enter: