mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-08-26 09:37:43 +00:00
Build on API 21 headers
This commit is contained in:
@@ -8,7 +8,7 @@ ifdef B_MAGISK
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := magisk
|
||||
LOCAL_STATIC_LIBRARIES := libnanopb libsystemproperties libutils libphmap libxhook
|
||||
LOCAL_STATIC_LIBRARIES := libnanopb libsystemproperties libutils-shared libphmap libxhook
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
core/applets.cpp \
|
||||
@@ -134,7 +134,7 @@ ifneq (,$(wildcard jni/test.cpp))
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := test
|
||||
LOCAL_STATIC_LIBRARIES := libutils libphmap
|
||||
LOCAL_STATIC_LIBRARIES := libutils-shared libphmap
|
||||
LOCAL_SRC_FILES := test.cpp
|
||||
include $(BUILD_EXECUTABLE)
|
||||
|
||||
|
@@ -3,10 +3,19 @@ APP_CFLAGS := -Wall -Oz -fomit-frame-pointer -flto
|
||||
APP_LDFLAGS := -flto
|
||||
APP_CPPFLAGS := -std=c++17
|
||||
APP_STL := none
|
||||
APP_PLATFORM := android-16
|
||||
APP_PLATFORM := android-21
|
||||
APP_THIN_ARCHIVE := true
|
||||
APP_STRIP_MODE := --strip-all
|
||||
|
||||
ifneq ($(TARGET_ARCH),arm64)
|
||||
ifneq ($(TARGET_ARCH),x86_64)
|
||||
ifndef B_SHARED
|
||||
# Disable fortify on static 32-bit targets
|
||||
APP_CFLAGS += -D_FORTIFY_SOURCE=0 -Wno-macro-redefined
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
# Busybox should use stock libc.a
|
||||
ifdef B_BB
|
||||
APP_PLATFORM := android-22
|
||||
|
@@ -11,10 +11,6 @@
|
||||
#define PR_SET_VMA_ANON_NAME 0
|
||||
#endif
|
||||
|
||||
// Missing functions
|
||||
#define getline compat_getline
|
||||
ssize_t compat_getline(char **, size_t *, FILE *);
|
||||
|
||||
// Rename symbols
|
||||
#pragma redefine_extname __system_property_set _system_property_set2
|
||||
#pragma redefine_extname __system_property_find _system_property_find2
|
||||
|
@@ -1,3 +1,11 @@
|
||||
// Force using legacy_signal_inlines.h
|
||||
#define __ANDROID_API_BACKUP__ __ANDROID_API__
|
||||
#undef __ANDROID_API__
|
||||
#define __ANDROID_API__ 20
|
||||
#include <android/legacy_signal_inlines.h>
|
||||
#undef __ANDROID_API__
|
||||
#define __ANDROID_API__ __ANDROID_API_BACKUP__
|
||||
|
||||
#include <sys/mount.h>
|
||||
#include <map>
|
||||
|
||||
|
@@ -2,14 +2,7 @@ LOCAL_PATH := $(call my-dir)
|
||||
|
||||
# All Magisk common code lives here
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE:= libutils
|
||||
LOCAL_C_INCLUDES := jni/include $(LOCAL_PATH)/include out/generated
|
||||
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
|
||||
LOCAL_EXPORT_STATIC_LIBRARIES := libcxx
|
||||
LOCAL_STATIC_LIBRARIES := libcxx
|
||||
LOCAL_SRC_FILES := \
|
||||
missing.cpp \
|
||||
UTILS_SRC_FILES := \
|
||||
new.cpp \
|
||||
files.cpp \
|
||||
misc.cpp \
|
||||
@@ -18,4 +11,20 @@ LOCAL_SRC_FILES := \
|
||||
xwrap.cpp \
|
||||
stream.cpp
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE:= libutils
|
||||
LOCAL_C_INCLUDES := jni/include $(LOCAL_PATH)/include out/generated
|
||||
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
|
||||
LOCAL_EXPORT_STATIC_LIBRARIES := libcxx
|
||||
LOCAL_STATIC_LIBRARIES := libcxx
|
||||
LOCAL_SRC_FILES := $(UTILS_SRC_FILES) missing.cpp
|
||||
include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE:= libutils-shared
|
||||
LOCAL_C_INCLUDES := jni/include $(LOCAL_PATH)/include out/generated
|
||||
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
|
||||
LOCAL_EXPORT_STATIC_LIBRARIES := libcxx
|
||||
LOCAL_STATIC_LIBRARIES := libcxx
|
||||
LOCAL_SRC_FILES := $(UTILS_SRC_FILES)
|
||||
include $(BUILD_STATIC_LIBRARY)
|
||||
|
@@ -1,19 +1,19 @@
|
||||
/*
|
||||
* Host all missing/incomplete implementation in bionic
|
||||
* Copied from various sources
|
||||
* */
|
||||
// This file implements all missing symbols that should exist in normal API 21
|
||||
// libc.a but missing in our extremely lean libc.a replacements.
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <cerrno>
|
||||
#include <mntent.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#include "missing.hpp"
|
||||
extern "C" {
|
||||
|
||||
/* Original source: https://github.com/freebsd/freebsd/blob/master/contrib/file/src/getline.c
|
||||
* License: BSD, full copyright notice please check original source */
|
||||
|
||||
ssize_t compat_getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp) {
|
||||
ssize_t getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp) {
|
||||
char *ptr, *eptr;
|
||||
|
||||
if (*buf == nullptr || *bufsiz == 0) {
|
||||
@@ -49,14 +49,14 @@ ssize_t compat_getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp) {
|
||||
}
|
||||
}
|
||||
|
||||
ssize_t compat_getline(char **buf, size_t *bufsiz, FILE *fp) {
|
||||
ssize_t getline(char **buf, size_t *bufsiz, FILE *fp) {
|
||||
return getdelim(buf, bufsiz, '\n', fp);
|
||||
}
|
||||
|
||||
/* Original source: https://android.googlesource.com/platform/bionic/+/master/libc/bionic/mntent.cpp
|
||||
* License: AOSP, full copyright notice please check original source */
|
||||
|
||||
struct mntent *compat_getmntent_r(FILE* fp, struct mntent* e, char* buf, int buf_len) {
|
||||
struct mntent *getmntent_r(FILE *fp, struct mntent *e, char *buf, int buf_len) {
|
||||
memset(e, 0, sizeof(*e));
|
||||
while (fgets(buf, buf_len, fp) != nullptr) {
|
||||
// Entries look like "proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0".
|
||||
@@ -79,31 +79,58 @@ struct mntent *compat_getmntent_r(FILE* fp, struct mntent* e, char* buf, int buf
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
FILE *compat_setmntent(const char* path, const char* mode) {
|
||||
FILE *setmntent(const char *path, const char *mode) {
|
||||
return fopen(path, mode);
|
||||
}
|
||||
|
||||
int compat_endmntent(FILE* fp) {
|
||||
int endmntent(FILE *fp) {
|
||||
if (fp != nullptr) {
|
||||
fclose(fp);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
char *compat_hasmntopt(const struct mntent* mnt, const char* opt) {
|
||||
char* token = mnt->mnt_opts;
|
||||
char* const end = mnt->mnt_opts + strlen(mnt->mnt_opts);
|
||||
const size_t optLen = strlen(opt);
|
||||
while (token) {
|
||||
char* const tokenEnd = token + optLen;
|
||||
if (tokenEnd > end) break;
|
||||
if (memcmp(token, opt, optLen) == 0 &&
|
||||
(*tokenEnd == '\0' || *tokenEnd == ',' || *tokenEnd == '=')) {
|
||||
return token;
|
||||
}
|
||||
token = strchr(token, ',');
|
||||
if (token) token++;
|
||||
}
|
||||
return nullptr;
|
||||
// Missing system call wrappers
|
||||
|
||||
int setns(int fd, int nstype) {
|
||||
return syscall(__NR_setns, fd, nstype);
|
||||
}
|
||||
|
||||
int unshare(int flags) {
|
||||
return syscall(__NR_unshare, flags);
|
||||
}
|
||||
|
||||
int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags) {
|
||||
return syscall(__NR_accept4, sockfd, addr, addrlen, flags);
|
||||
}
|
||||
|
||||
int dup3(int oldfd, int newfd, int flags) {
|
||||
return syscall(__NR_dup3, oldfd, newfd, flags);
|
||||
}
|
||||
|
||||
ssize_t readlinkat(int dirfd, const char *pathname, char *buf, size_t bufsiz) {
|
||||
return syscall(__NR_readlinkat, dirfd, pathname, buf, bufsiz);
|
||||
}
|
||||
|
||||
int symlinkat(const char *target, int newdirfd, const char *linkpath) {
|
||||
return syscall(__NR_symlinkat, target, newdirfd, linkpath);
|
||||
}
|
||||
|
||||
int linkat(int olddirfd, const char *oldpath,
|
||||
int newdirfd, const char *newpath, int flags) {
|
||||
return syscall(__NR_linkat, olddirfd, oldpath, newdirfd, newpath, flags);
|
||||
}
|
||||
|
||||
int inotify_init1(int flags) {
|
||||
return syscall(__NR_inotify_init1, flags);
|
||||
}
|
||||
|
||||
int faccessat(int dirfd, const char *pathname, int mode, int flags) {
|
||||
return syscall(__NR_faccessat, dirfd, pathname, mode, flags);
|
||||
}
|
||||
|
||||
#if !defined(__LP64__)
|
||||
void android_set_abort_message(const char *msg) {}
|
||||
#endif
|
||||
|
||||
} // extern "C"
|
||||
|
@@ -2,73 +2,8 @@
|
||||
|
||||
#include <sys/syscall.h>
|
||||
#include <unistd.h>
|
||||
#include <mntent.h>
|
||||
|
||||
// Missing libc functions
|
||||
#define getline compat_getline
|
||||
#define getdelim compat_getdelim
|
||||
#define getmntent_r compat_getmntent_r
|
||||
#define setmntent compat_setmntent
|
||||
#define endmntent compat_endmntent
|
||||
#define hasmntopt compat_hasmntopt
|
||||
|
||||
// Missing syscall wrappers
|
||||
#define setns compat_setns
|
||||
#define unshare compat_unshare
|
||||
#define accept4 compat_accept4
|
||||
#define dup3 compat_dup3
|
||||
#define readlinkat compat_readlinkat
|
||||
#define symlinkat compat_symlinkat
|
||||
#define linkat compat_linkat
|
||||
#define inotify_init1 compat_inotify_init1
|
||||
#define faccessat compat_faccessat
|
||||
#define sigtimedwait compat_sigtimedwait
|
||||
|
||||
ssize_t compat_getline(char **lineptr, size_t *n, FILE *stream);
|
||||
ssize_t compat_getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
|
||||
struct mntent *compat_getmntent_r(FILE* fp, struct mntent* e, char* buf, int buf_len);
|
||||
FILE *compat_setmntent(const char* path, const char* mode);
|
||||
int compat_endmntent(FILE* fp);
|
||||
char *compat_hasmntopt(const struct mntent* mnt, const char* opt);
|
||||
|
||||
static inline int compat_setns(int fd, int nstype) {
|
||||
return syscall(__NR_setns, fd, nstype);
|
||||
}
|
||||
|
||||
static inline int compat_unshare(int flags) {
|
||||
return syscall(__NR_unshare, flags);
|
||||
}
|
||||
|
||||
static inline int compat_accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags) {
|
||||
return syscall(__NR_accept4, sockfd, addr, addrlen, flags);
|
||||
}
|
||||
|
||||
static inline int compat_dup3(int oldfd, int newfd, int flags) {
|
||||
return syscall(__NR_dup3, oldfd, newfd, flags);
|
||||
}
|
||||
|
||||
static inline ssize_t compat_readlinkat(int dirfd, const char *pathname, char *buf, size_t bufsiz) {
|
||||
return syscall(__NR_readlinkat, dirfd, pathname, buf, bufsiz);
|
||||
}
|
||||
|
||||
static inline int compat_symlinkat(const char *target, int newdirfd, const char *linkpath) {
|
||||
return syscall(__NR_symlinkat, target, newdirfd, linkpath);
|
||||
}
|
||||
|
||||
static inline int compat_linkat(int olddirfd, const char *oldpath,
|
||||
int newdirfd, const char *newpath, int flags) {
|
||||
return syscall(__NR_linkat, olddirfd, oldpath, newdirfd, newpath, flags);
|
||||
}
|
||||
|
||||
static inline int compat_inotify_init1(int flags) {
|
||||
return syscall(__NR_inotify_init1, flags);
|
||||
}
|
||||
|
||||
static inline int compat_faccessat(int dirfd, const char *pathname, int mode, int flags) {
|
||||
return syscall(__NR_faccessat, dirfd, pathname, mode, flags);
|
||||
}
|
||||
|
||||
static inline int compat_sigtimedwait(const sigset_t* set, siginfo_t* info, const timespec* timeout) {
|
||||
static inline int sigtimedwait(const sigset_t* set, siginfo_t* info, const timespec* timeout) {
|
||||
union {
|
||||
sigset_t set;
|
||||
sigset_t set64;
|
||||
|
@@ -1,3 +1,5 @@
|
||||
#include <unistd.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/xattr.h>
|
||||
|
||||
#include <utils.hpp>
|
||||
|
@@ -1,3 +1,4 @@
|
||||
#include <unistd.h>
|
||||
#include <cstddef>
|
||||
|
||||
#include <utils.hpp>
|
||||
|
@@ -8,6 +8,7 @@
|
||||
#include <sys/mman.h>
|
||||
#include <sys/sendfile.h>
|
||||
#include <sys/ptrace.h>
|
||||
#include <sys/inotify.h>
|
||||
|
||||
#include <utils.hpp>
|
||||
|
||||
@@ -198,26 +199,9 @@ int xlisten(int sockfd, int backlog) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int accept4_compat(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags) {
|
||||
int fd = accept(sockfd, addr, addrlen);
|
||||
if (fd < 0) {
|
||||
PLOGE("accept");
|
||||
} else {
|
||||
if (flags & SOCK_CLOEXEC)
|
||||
fcntl(fd, F_SETFD, FD_CLOEXEC);
|
||||
if (flags & SOCK_NONBLOCK) {
|
||||
int i = fcntl(fd, F_GETFL);
|
||||
fcntl(fd, F_SETFL, i | O_NONBLOCK);
|
||||
}
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
int xaccept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags) {
|
||||
int fd = accept4(sockfd, addr, addrlen, flags);
|
||||
if (fd < 0) {
|
||||
if (errno == ENOSYS)
|
||||
return accept4_compat(sockfd, addr, addrlen, flags);
|
||||
PLOGE("accept4");
|
||||
}
|
||||
return fd;
|
||||
|
Reference in New Issue
Block a user