有没有一种方法可以计算函数的大小?我有一个指向函数的指针,我需要使用memcpy复制整个函数。我需要malloc一些空间,并知道memcpy的第三个参数——大小。我知道sizeof(function)
不起作用。你有什么建议吗?
有没有办法计算函数的大小?我有一个指向函数的指针,需要使用memcpy复制整个函数。我需要分配一些空间,并且了解memcpy的第三个参数即大小。但是sizeof(function)
无效。你有什么建议吗?
有没有一种方法可以计算函数的大小?我有一个指向函数的指针,我需要使用memcpy复制整个函数。我需要malloc一些空间,并知道memcpy的第三个参数——大小。我知道sizeof(function)
不起作用。你有什么建议吗?
有没有办法计算函数的大小?我有一个指向函数的指针,需要使用memcpy复制整个函数。我需要分配一些空间,并且了解memcpy的第三个参数即大小。但是sizeof(function)
无效。你有什么建议吗?
在C语言中,函数不是一等公民对象。这意味着它们无法传递给另一个函数,无法从函数返回,并且无法复制到内存的其他部分。
但是,函数指针可以满足所有这些要求,而且是一等公民对象。函数指针只是一个内存地址,通常与计算机上的任何其他指针具有相同的大小。
这段话并没有直接回答你的问题,但是你不应该在内核代码中实现从内核到用户空间的回调。
向内核空间注入代码也不是一个好的解决方案。
更好的方法是将用户/内核边界看作进程间边界。通过字符设备通过明确定义的协议来传递数据,而不是代码。如果你确实需要传递代码,只需将其封装在内核模块中。然后你可以像.so
插件系统一样动态加载/卸载它。
memcpy()
传递给内核。你需要提醒自己它是一个非常特殊的函数。它在C标准中定义,相当简单,并且具有相当广泛的范围,因此它是编译器提供的内置函数的完美目标。
就像strlen()
、strcmp()
和GCC中的其他函数一样。
也就是说,它是内置的并不妨碍你获取它的指针。
:your_func_epilogue
mov esp, ebp
pop ebp
ret
:end_of_func
;expect a varying length run of NOPs here
:next_func_prologue
push ebp
mov ebp, esp
看起来你想从内核驱动程序回调到用户空间,以便在一些异步作业完成时通知用户空间。
这听起来很合理,因为这可能是常规用户空间库处理事情的方式 - 但对于内核/用户空间接口来说,它是完全错误的。即使你设法将函数代码复制到内核中,并使其适当地位置无关,它仍然是错误的,因为内核和用户空间代码在根本上执行于不同的上下文中。只举一个可能会引起问题的差异示例,如果由于交换出页而在内核上下文中发生页面故障,那么这将导致内核 oops 而不是交换该页。
正确的方法是内核在异步作业完成时使某些文件描述符可读(在您的情况下,此文件描述符几乎肯定是驱动程序提供的字符设备)。然后,用户空间进程可以使用 select
/ poll
或 read
等待此事件 - 如果需要,可以将文件描述符设置为非阻塞,并基本上只使用所有标准的 UNIX 工具来处理此情况。毕竟,这就是网络套接字(以及几乎所有其他异步情况)的异步特性是如何处理的。
read
时提供该信息。函数不仅仅是可以复制的对象。那么交叉引用/符号等呢?当然,您可以使用类似标准Linux“binutils”软件包并折磨您的二进制文件,但这是否是您想要的?
顺便说一下,如果您只是尝试替换memcpy()实现,请查看LD_PRELOAD机制。