是否有可能编译包含非内核包含的功能的linux内核(2.6)模块?
例如:
kernelmodule.h
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h> // printk()
// ...
#include <openssl/sha.h>
// ...
Run Code Online (Sandbox Code Playgroud)
Makefile文件
obj-m := kernelmodule.o
all:
$(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules
clean:
$(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean
$(RM) Module.markers modules.order
Run Code Online (Sandbox Code Playgroud)
我编写并尝试编译的内核模块包含许多openssl包含文件中的功能.
上面提到的标准makefile不允许包含在linux头文件之外.是否可以包含此功能,如果可以,请指出我正确的方向.
谢谢,迈克
如果我这样做,--strip-debug或者--strip-unneeded我有.ko列出所有函数名称nm,如果我这样做,strip foo.ko我有一个拒绝加载的内核模块.
有没有人知道如何删除模块加载不需要的所有符号的快捷方式,以便人们无法对API进行反向工程设计?
PS:对于所有开源bigots传教士; 这是一般公众在任何情况下都不会使用的东西,因此不需要将问题变成GPL火焰战争.
我正在开发内核模块的使用计数有问题.我想打印它以进行调试.如何从模块代码中获取它?
有问题的内核版本 - Linux 2.6.32
首先:我不是专家,所以请原谅我试图解释自己的任何错误.
我正在尝试使用Sparc-为SPARC机器交叉编译外部Linux模块Linux-GCC-4.4.2.Linux内核的版本是2.6.36.4-00037-g059aa91-dirty.它已经使用LEON处理器中的一些文件进行了修补.构建流程提供给我和它使用LinuxBuild,Buildroot和Busybox.我正在尝试制作32位操作系统.
一切似乎都有效,但在我编译模块并尝试将其发送到SPARC系统后,我收到此错误:
module hellok: Unknown relocation: 6
Run Code Online (Sandbox Code Playgroud)
这个错误来自于~/linuxbuild-1.0.3/linux/linux-2.6-git/arch/sparc/kernel/module.c
我将为完整性提供整个方法:
int apply_relocate_add(Elf_Shdr *sechdrs,
const char *strtab,
unsigned int symindex,
unsigned int relsec,
struct module *me)
{
unsigned int i;
Elf_Rela *rel = (void *)sechdrs[relsec].sh_addr;
Elf_Sym *sym;
u8 *location;
u32 *loc32;
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
Elf_Addr v;
/* This is where to make the change */
location = (u8 *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ …Run Code Online (Sandbox Code Playgroud) 这可能听起来像一个奇怪的问题,但当我去打开文件时:
int fd;
fd = open("/dev/somedevice", O_RDWR);
Run Code Online (Sandbox Code Playgroud)
我究竟回到了什么地方?我可以看到手册页说:
The open() function shall return a file descriptor for the named file that is the lowest file descriptor not currently open for that process
但是这样吗?它只是一个int或是否在幕后附加了数据?我问的原因是我找到了一些代码(Linux/C),我们从用户空间打开文件:
//User space code:
int fdC;
if ((fdC = open(DEVICE, O_RDWR)) < 0) {
printf("Error opening device %s (%s)\n", DEVICE, strerror(errno));
goto error_exit;
}
while (!fQuit) {
if ((nRet = read(fdC, &rx_message, 1)) > 0) {
Run Code Online (Sandbox Code Playgroud)
然后在内核端,该模块的文件操作(提供fd)映射读取到n_read()函数:
struct file_operations can_fops = {
owner: THIS_MODULE, …Run Code Online (Sandbox Code Playgroud) 我正在使用涉及内核和用户空间代码的大型嵌入式软件(ARM处理器,嵌入式Linux 2.6.31,busybox).首先加载一个内核模块,然后守护进程与模块建立netlink套接字.
这里的问题是在杀死守护进程后,我无法再从内存中卸载模块:
% rmmod _module.ko
% rmmod: _module.ko: Resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)
分析表明,错误(返回值是-11,即EAGAIN?)是try_stop_module()在syscall delete_module()定义中调用的kernel/module.c.函数try_stop_module()依次调用stop_machine(),这就是我卡住的地方,
我不确定那里到底发生了什么.我认为根本原因是守护进程中的某个地方打开了与模块的连接,显然是其他东西并且在退出时没有正确关闭/清理(显然有些引用/锁没有被释放?)
有没有人知道还有什么可以看和探测?
我正在编写一个内核模块,由进程p1调用以覆盖属于目标进程p2的数据页.
首先,在内核模块内部并且在响应p1发出的proc文件系统的写事件时.我使用目标进程的进程id(p2)来搜索后者的任务结构(p2_task).
要搜索我使用的特定页面get_user_pages(),显然在(p2_task->mm)上调用它.然后我调用了kmap()上一个函数返回的页面.一旦我得到指针,我就使用典型的内存函数(memset())来写入该内存.最后叫了kunmap().
但是,一旦进程再次开始运行,我就可以看到我所做的对目标进程p2没有影响.
我不确定我做错了什么.有人可以帮忙吗?
我怀疑在回应来自p2的请求时,某种程度上你无法写入内存属于进程p2.从这里开始,我们处于不同的背景下.
这是真的,如果不是我能检查的其他内容.如果是问题,反正我可以解决这个问题吗?
我正在使用一些Linux内核模块,并且有一个与循环加载问题相关的问题.
模块A首先加载并导出许多符号,供模块B或C使用.然后,模块B或C被加载,并且符号存在供其使用.
但是,我现在发现模块A需要来自模块B或C的符号,但仅在运行时期间,而不需要初始化模块.所以当A加载时,它发现该符号尚不存在.我甚至在模块A中将符号标记为extern,但这也没有用.
加载模块A后是否可以延迟加载符号,但在加载B或C之前它仍然不存在?
我想用石灰倾倒我的手机内存,但在这个过程中我遇到了一些问题.1.Downloaded内核源码和构建,创建了zImage.
2.改变石灰的Makefile作为指导说,然后我做石灰.(尽管我的案例已创建lime.ko文件和lime-3.8.0-29-generic.ko文件,但在此步骤中出现问题)
3.命令./adb push~/lime-forensics/src/lime-3.8.0-29-generic.ko /sdcard/lime.ko成功推送
4.Rooted phone接受以root身份访问adb shell,并且lime insmod命令失败以转储内存
问题是当在adb shell类型命令insmod /sdcard/lime.ko"path =/sdcard/ram.lime format = lime"时出现此错误
# insmod /sdcard/lime.ko "path=/sdcard/ram.lime format=lime>
insmod: init_module '/sdcard/lime.ko' failed (Exec format error).
Run Code Online (Sandbox Code Playgroud)
我犯了什么可能的错误以及如何解决此错误并继续?
如果在初始化和退出模块中使用__init和__exit属性会发生什么,如果我不使用它们会发生什么.示例如下所示.
使用属性
static __init int myinit(void)
{}
static __exit void myexit(void)
{}
Run Code Online (Sandbox Code Playgroud)
Witout属性
static int myinit(void)
{}
static void myexit(void)
{}
Run Code Online (Sandbox Code Playgroud) kernel-module ×10
linux-kernel ×7
linux ×4
kernel ×2
adb ×1
android ×1
c ×1
galaxy ×1
makefile ×1
memory ×1
relocation ×1
sparc ×1
strip ×1