Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gpkg/glibc: corrections #173

Merged
merged 1 commit into from
Jan 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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