Skip to content

Commit

Permalink
gpkg/glibc: corrections
Browse files Browse the repository at this point in the history
ldd fix for x86_64
fix mprotect.c
ignore system call 1008 and mbind
  • Loading branch information
Maxython committed Jan 1, 2024
1 parent 9506b01 commit 1aeaf92
Show file tree
Hide file tree
Showing 14 changed files with 221 additions and 69 deletions.
8 changes: 0 additions & 8 deletions gpkg/glibc/aarch64-arch-syscall.h.patch
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,6 @@
#define __NR_get_mempolicy 236
#define __NR_get_robust_list 100
#define __NR_getcpu 168
@@ -124,7 +119,6 @@
#define __NR_lseek 62
#define __NR_lsetxattr 6
#define __NR_madvise 233
-#define __NR_mbind 235
#define __NR_membarrier 283
#define __NR_memfd_create 279
#define __NR_memfd_secret 447
@@ -168,7 +162,6 @@
#define __NR_personality 92
#define __NR_pidfd_getfd 438
Expand Down
8 changes: 0 additions & 8 deletions gpkg/glibc/arm-arch-syscall.h.patch
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,6 @@
#define __NR_getpid 20
#define __NR_getppid 64
#define __NR_getpriority 96
@@ -168,7 +158,6 @@
#define __NR_lstat 107
#define __NR_lstat64 196
#define __NR_madvise 220
-#define __NR_mbind 319
#define __NR_membarrier 389
#define __NR_memfd_create 385
#define __NR_migrate_pages 400
@@ -220,7 +209,6 @@
#define __NR_personality 136
#define __NR_pidfd_getfd 438
Expand Down
13 changes: 11 additions & 2 deletions gpkg/glibc/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ TERMUX_PKG_DESCRIPTION="GNU C Library"
TERMUX_PKG_LICENSE="GPL-3.0, LGPL-3.0"
TERMUX_PKG_MAINTAINER="@termux-pacman"
TERMUX_PKG_VERSION=2.38
TERMUX_PKG_REVISION=10
TERMUX_PKG_REVISION=11
TERMUX_PKG_SRCURL=https://ftp.gnu.org/gnu/libc/glibc-$TERMUX_PKG_VERSION.tar.xz
TERMUX_PKG_SHA256=fb82998998b2b29965467bc1b69d152e9c307d2cf301c9eafb4555b770ef3fd2
TERMUX_PKG_DEPENDS="linux-api-headers-glibc"
Expand All @@ -16,11 +16,20 @@ termux_step_pre_configure() {
termux_error_exit "Compilation is only possible based on glibc"
fi

for i in shmem-android.h mprotect.c; do
for i in shmem-android.h mprotect.c ignore-syscall.h; do
install -Dm644 "${TERMUX_PKG_BUILDER_DIR}/${i}" "${TERMUX_PKG_SRCDIR}/sysdeps/unix/sysv/linux/${i}"
done

rm ${TERMUX_PKG_SRCDIR}/sysdeps/unix/sysv/linux/*/clone3.S
rm ${TERMUX_PKG_SRCDIR}/sysdeps/unix/sysv/linux/x86_64/configure*

if [ "$TERMUX_ARCH" = "i686" ]; then
mv ${TERMUX_PKG_SRCDIR}/sysdeps/unix/sysv/linux/i386/syscall.S \
${TERMUX_PKG_SRCDIR}/sysdeps/unix/sysv/linux/i386/syscallS.S
else
mv ${TERMUX_PKG_SRCDIR}/sysdeps/unix/sysv/linux/${TERMUX_ARCH}/syscall.S \
${TERMUX_PKG_SRCDIR}/sysdeps/unix/sysv/linux/${TERMUX_ARCH}/syscallS.S
fi

for i in android_passwd_group.h android_passwd_group.c android_system_user_ids.h; do
cp ${TERMUX_PKG_BUILDER_DIR}/${i} ${TERMUX_PKG_SRCDIR}/nss/
Expand Down
21 changes: 21 additions & 0 deletions gpkg/glibc/dl-load.c.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
--- src/elf/dl-load.c 2023-07-31 20:54:16.000000000 +0300
+++ src/elf/dl-load.c.patch 2023-12-25 17:28:25.688056890 +0300
@@ -1330,15 +1330,15 @@
errstring = N_("cannot change memory protections");
goto lose_errno;
}
- __stack_prot |= PROT_READ|PROT_WRITE|PROT_EXEC;
+ __stack_prot |= PROT_READ|PROT_WRITE;
__mprotect ((void *) p, s, PROT_READ);
}
else
- __stack_prot |= PROT_READ|PROT_WRITE|PROT_EXEC;
+ __stack_prot |= PROT_READ|PROT_WRITE;
}
else
#endif
- __stack_prot |= PROT_READ|PROT_WRITE|PROT_EXEC;
+ __stack_prot |= PROT_READ|PROT_WRITE;

#ifdef check_consistency
check_consistency ();
8 changes: 0 additions & 8 deletions gpkg/glibc/i386-arch-syscall.h.patch
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,6 @@
#define __NR_getpid 20
#define __NR_getpmsg 188
#define __NR_getppid 64
@@ -181,7 +172,6 @@
#define __NR_lstat 107
#define __NR_lstat64 196
#define __NR_madvise 219
-#define __NR_mbind 274
#define __NR_membarrier 375
#define __NR_memfd_create 356
#define __NR_memfd_secret 447
@@ -239,7 +229,6 @@
#define __NR_personality 136
#define __NR_pidfd_getfd 438
Expand Down
17 changes: 17 additions & 0 deletions gpkg/glibc/ignore-syscall.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef _IGNORE_SYSCALL
#define _IGNORE_SYSCALL

#include <arch-syscall.h>

struct IdSyscalls {
int id;
};

static struct IdSyscalls ListIgnoreSyscall[] = {
{ __NR_mbind },
{ 1008 }, // for some reason used in julia
};

#define count_ignore_syscall (sizeof(ListIgnoreSyscall) / sizeof(ListIgnoreSyscall[0]))

#endif //_IGNORE_SYSCALL
File renamed without changes.
10 changes: 10 additions & 0 deletions gpkg/glibc/misc-Makefile.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
--- glibc-2.38/misc/Makefile 2023-07-31 20:54:16.000000000 +0300
+++ glibc-2.38/misc/Makefile.patch 2023-12-26 00:08:33.550537534 +0300
@@ -192,6 +192,7 @@
swapon \
sync \
syncfs \
+ syscallS \
syscall \
syslog \
truncate \
11 changes: 11 additions & 0 deletions gpkg/glibc/misc-Versions.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
--- glibc-2.38/misc/Versions 2023-07-31 20:54:16.000000000 +0300
+++ glibc-2.38/misc/Versions.patch 2024-01-01 13:56:26.514498144 +0300
@@ -71,7 +71,7 @@
# s*
sbrk; select; setdomainname; setfsent; sethostent; sethostid; sethostname;
setlogmask; setmntent; setregid; setreuid; setttyent; setusershell; sstk;
- stty; sync; syscall; syslog;
+ stty; sync; syscallS; syscall; syslog;

# t*
tdelete; tfind; truncate; tsearch; ttyslot; twalk;
66 changes: 31 additions & 35 deletions gpkg/glibc/mprotect.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
#include <not-cancel.h>

#ifdef SHARED
# define GLOBAL_READ_SIZE 45
# define GLOBAL_READ_SIZE 1024

/* - String To Unsigned Long Int
There are two chairs - one is called "strtoul", the other "stuli"...
Expand All @@ -42,61 +42,57 @@ unsigned long int __stuli(char *value) {

static int __is_mmaped(void *addr) {
char buff[GLOBAL_READ_SIZE];
char *buff2;
char maddr[GLOBAL_READ_SIZE*2];
memset(maddr, 0, sizeof(maddr));

int skip = 0;
int res = 1;

char *buff2 = "";
char *cont = "";
int res = 0;
int strlc, strlb;
memset(buff, 0, sizeof(buff));
int map = __open_nocancel("/proc/self/maps", O_RDONLY|O_CLOEXEC);
if (map >= 0) {
while (__read_nocancel(map, buff, GLOBAL_READ_SIZE) == GLOBAL_READ_SIZE) {
while (__read_nocancel(map, buff, GLOBAL_READ_SIZE) > 0) {
buff[GLOBAL_READ_SIZE] = '\0';
if (skip == 1)
if ((buff2=strrchr(buff, '\n')) != NULL)
memcpy(maddr, &buff2[1], strlen(&buff2[1])+1);
else
continue;
if (strrchr(maddr, '-') == NULL) {
if (skip == 1) {
skip = 0;
continue;
}
__strncat(maddr, buff, GLOBAL_READ_SIZE);
strlc = strlen(cont);
if (strlc > 0) {
buff2 = malloc(sizeof(char)*strlc);
memcpy(buff2, cont, strlc);
}
if (__stuli(strtok(maddr, "-")) == (unsigned long int)addr) {
res = 0;
cont = malloc(sizeof(char)*(strlc+strlen(buff)));
memset(cont, 0, sizeof(cont));
strlb = strlen(buff2);
if (strlb > 0)
memcpy(cont, buff2, strlb);
__strncat(cont, buff, GLOBAL_READ_SIZE);
memset(buff, 0, sizeof(buff));
}
char *saveptr;
while ((buff2 = strtok_r(cont, "\n", &cont)))
if (__stuli(strtok_r(buff2, "-", &saveptr)) == (unsigned long int)addr) {
res = 1;
break;
}
memset(maddr, 0, sizeof(maddr));
if ((buff2=strrchr(buff, '\n')) != NULL)
memcpy(maddr, &buff2[1], strlen(&buff2[1])+1);
else
skip = 1;
}
__close_nocancel_nostatus(map);
}

__close_nocancel_nostatus(map);
return res;
}
#endif

int __mprotect(void *addr, size_t len, int prot) {
int res = INLINE_SYSCALL_CALL(mprotect, addr, len, prot);
#ifdef SHARED
if (res == -1 && errno == EACCES && prot & PROT_EXEC && __is_mmaped(addr) == 1) {
if (res == -1 && errno == EACCES && prot & PROT_EXEC && !__is_mmaped(addr)) {
size_t saddr = strlen(addr)+1;
void *caddr;
int mmap_flags = MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED;
if (prot & PROT_GROWSDOWN)
mmap_flags |= MAP_GROWSDOWN;
if (saddr > 1) {
caddr = malloc(saddr);
memcpy(caddr, addr, saddr);
}
mmap(addr, len, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
if (saddr > 1) {
free(addr);
addr = mmap(addr, len, PROT_READ|PROT_WRITE|PROT_EXEC, mmap_flags, -1, 0);
if (saddr > 1)
memcpy(addr, caddr, saddr);
free(caddr);
}
return INLINE_SYSCALL_CALL(mprotect, addr, len, prot);
}
#endif
Expand Down
68 changes: 68 additions & 0 deletions gpkg/glibc/syscall.S.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
--- glibc-2.38/sysdeps/unix/sysv/linux/aarch64/syscall.S 2023-07-31 20:54:16.000000000 +0300
+++ glibc-2.38/sysdeps/unix/sysv/linux/aarch64/syscall.S.patch 2023-12-25 22:43:44.138402265 +0300
@@ -26,7 +26,7 @@
For kernel entry we need to move the system call nr to x8 then
load the remaining arguments to register. */

-ENTRY (syscall)
+ENTRY (syscallS)
uxtw x8, w0
mov x0, x1
mov x1, x2
@@ -41,4 +41,4 @@
RET
1:
b SYSCALL_ERROR
-PSEUDO_END (syscall)
+PSEUDO_END (syscallS)
--- glibc-2.38/sysdeps/unix/sysv/linux/arm/syscall.S 2023-07-31 20:54:16.000000000 +0300
+++ glibc-2.38/sysdeps/unix/sysv/linux/arm/syscall.S.patch 2023-12-25 22:45:38.988402221 +0300
@@ -21,7 +21,7 @@
implement syscall(). It won't work reliably with 64-bit arguments
(but that is true on many modern platforms). */

-ENTRY (syscall)
+ENTRY (syscallS)
mov ip, sp
push {r4, r5, r6, r7}
cfi_adjust_cfa_offset (16)
@@ -45,4 +45,4 @@
it cc
RETINSTR(cc, lr)
b PLTJMP(syscall_error)
-PSEUDO_END (syscall)
+PSEUDO_END (syscallS)
--- glibc-2.38/sysdeps/unix/sysv/linux/x86_64/syscall.S 2023-07-31 20:54:16.000000000 +0300
+++ glibc-2.38/sysdeps/unix/sysv/linux/x86_64/syscall.S.patch 2023-12-25 23:00:38.685827592 +0300
@@ -26,7 +26,7 @@


.text
-ENTRY (syscall)
+ENTRY (syscallS)
movq %rdi, %rax /* Syscall number -> rax. */
movq %rsi, %rdi /* shift arg1 - arg5. */
movq %rdx, %rsi
@@ -39,4 +39,4 @@
jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */
ret /* Return to caller. */

-PSEUDO_END (syscall)
+PSEUDO_END (syscallS)
--- glibc-2.38/sysdeps/unix/sysv/linux/i386/syscall.S 2023-07-31 20:54:16.000000000 +0300
+++ glibc-2.38/sysdeps/unix/sysv/linux/i386/syscall.S.patch 2023-12-25 23:01:40.765827568 +0300
@@ -21,7 +21,7 @@
more information about the value -4095 used below.*/

.text
-ENTRY (syscall)
+ENTRY (syscallS)

PUSHARGS_6 /* Save register contents. */
_DOARGS_6(44) /* Load arguments. */
@@ -32,4 +32,4 @@
jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */
ret /* Return to caller. */

-PSEUDO_END (syscall)
+PSEUDO_END (syscallS)
42 changes: 42 additions & 0 deletions gpkg/glibc/syscall.c.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
--- glibc-2.38/sysdeps/unix/sysv/linux/syscall.c 2023-07-31 20:54:16.000000000 +0300
+++ glibc-2.38/sysdeps/unix/sysv/linux/syscall.c.patch 2024-01-01 13:12:45.120508427 +0300
@@ -18,26 +18,26 @@

#include <stdarg.h>
#include <sysdep.h>
+#include <ignore-syscall.h>

long int
syscall (long int number, ...)
{
+ for (int i=0; i<count_ignore_syscall; ++i)
+ if (ListIgnoreSyscall[i].id == number)
+ return 0;
+
va_list args;

va_start (args, number);
- long int a0 = va_arg (args, long int);
- long int a1 = va_arg (args, long int);
- long int a2 = va_arg (args, long int);
- long int a3 = va_arg (args, long int);
- long int a4 = va_arg (args, long int);
- long int a5 = va_arg (args, long int);
+ long int res = syscallS (number,
+ va_arg (args, long int),
+ va_arg (args, long int),
+ va_arg (args, long int),
+ va_arg (args, long int),
+ va_arg (args, long int),
+ va_arg (args, long int));
va_end (args);

- long int r = INTERNAL_SYSCALL_NCS_CALL (number, a0, a1, a2, a3, a4, a5);
- if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (r)))
- {
- __set_errno (-r);
- return -1;
- }
- return r;
+ return res;
}
10 changes: 10 additions & 0 deletions gpkg/glibc/unistd.h.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
--- glibc-2.38/posix/unistd.h 2023-07-31 20:54:16.000000000 +0300
+++ glibc-2.38/posix/unistd.h.patch 2023-12-26 11:16:26.077614803 +0300
@@ -1088,6 +1088,7 @@

In Mach, all system calls take normal arguments and always return an
error code (zero for success). */
+extern long int syscallS (long int __sysno, ...) __THROW;
extern long int syscall (long int __sysno, ...) __THROW;

#endif /* Use misc. */
8 changes: 0 additions & 8 deletions gpkg/glibc/x86_64-arch-syscall.h.patch
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,6 @@
#define __NR_getpid 39
#define __NR_getpmsg 181
#define __NR_getppid 110
@@ -152,7 +144,6 @@
#define __NR_lsetxattr 189
#define __NR_lstat 6
#define __NR_madvise 28
-#define __NR_mbind 237
#define __NR_membarrier 324
#define __NR_memfd_create 319
#define __NR_memfd_secret 447
@@ -201,7 +192,6 @@
#define __NR_personality 135
#define __NR_pidfd_getfd 438
Expand Down

0 comments on commit 1aeaf92

Please sign in to comment.