我正在用android开发一个项目。它将拦截应用程序中所有的I/O请求(读/写)。现在我决定在libc的读/写功能中实现它。但是我发现读/write 函数由汇编语言编写。
bionic/libc/arch-arm/syscalls/read.S
我们的项目很复杂,这意味着我们不能通过更改汇编语言代码来实现。我正在考虑将程序集读取系统调用重命名为__read,然后编写一个C函数read()来替换程序集read()函数,read() 的所有其他调用将调用 C read() 而不是程序集 read()。C read() 只需调用程序集 __read 函数。这样我就可以在调用 read 函数之前做一些事情。但是我不知道该怎么做。请查看并提供反馈以了解要使用的说明,或者如果您对如何拦截应用程序中的 I/O 有其他想法也很好。我在 Nexus 6 上使用 Android 6.0.1。或在 Pixel2 上使用 Android 8也很好。
最佳答案
感谢您的帮助。我已经解决了这个问题。首先将read.S更改为__read.S,并将read.S中的read替换为__read。然后在bionic/libc/bionic写一个read.cpp,内容是:
#include <unistd.h>
#include <sys/read.h>
#include "private/libc_logging.h"
extern "C" ssize_t __read(int, void *, size_t);
ssize_t read(int a, void * b, size_t c){
/* 测试时打印log用
const char * tag = "DebugRead";
const char * format = "%s";
const char * msg = "Cpp read() called";
__libc_format_log(ANDROID_LOG_DEBUG, tag, format, msg);
*/
return __read(a,b,c);
}
在bionic/libc/include/sys中写一个read.h。代码是:
#ifndef _SYS_READ_H_
#define _SYS_READ_H_
#include <linux/unistd.h>
__BEGIN_DECLS
extern ssize_t __read(int, void *, size_t);
__END_DECLS
#endif /* _SYS_READ_H_ */
最后在bionic/libc/Android.mk中添加一个bionic/read.cpp\即可。
关于android - 如何在 Android 的 libc 和 syscall 之间添加一个 C 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55158859/