c - 我可以将内联函数编译为共享库,并使用 LD_PRELOAD 作为内联函数连接到其他可执行文件吗?
问题描述
我想将我的共享库挂钩到其他程序二进制文件,挂钩功能是这样的:
void my_function(void *data){
bool res = my_function_needed(data);
if (res){
// Do my work
}
else {
original_function(data);
}
}
挂钩函数将使用我的过程和原始函数参数之后。问题是,这个函数会被如此频繁地调用,性能在这里很重要。由于我无法在运行时更改函数调用地址本身(因为这是函数,而不是函数指针),因此必须保留 if-else 以确定正确的过程。
所以我想,至少,将这些函数(my_function() 和 my_function_needed())作为内联函数来减少函数调用开销。是否有可能使代码真正内联在动态库挂钩中?
解决方案
获取函数内联的方法是将函数源提供给编译器,并允许它内联到调用函数的内容中。在我熟悉的所有 C 和 C++ 编译器中,这必须发生在编译的代码生成阶段之前,通常是在解析之后的某个时间。动态链接库或静态链接库都是生成的可以使用的代码体;但是,此代码不会内联到正在编译的其他代码中。它在静态库的链接时编译后或操作系统加载程序将程序加载到内存时链接。
如果您希望一个函数可能被内联,您通常在 C 或 C++ 头文件中提供它。
推荐阅读
- python - 删除 Pandas 系列中带有标签条件的行
- json - 是否有使用 linq 处理 Json 函数的实体框架库或扩展?
- templates - freemarker.core.InvalidReferenceException:在 downloadreport.ftl 的第 62 行第 14 列未定义表达式 linkobj.range
- docker - 在 docker 容器开始运行后运行命令
- pdf - 查找pdf文本位置
- c# - NunitLite 将每个测试的日志信息记录到控制台
- java - Java 和 Selenium - 按文本在列表中选择单选按钮
- java - 一个非常简单的查询死锁
- java - 在同一个配置类中配置 jms 接收和发送队列
- jboss - 将 JMX 与 jconsole 连接时出错