ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

wayland学习笔记(八) wayland为什么要用libffi

2021-12-25 11:37:48  阅读:177  来源: 互联网

标签:调用 函数 编译 笔记 wayland 函数调用 libffi


前面了解到wayland是通过libffi来生成跳板函数。当时对libffi以及跳板函数的作用一头雾水,按照个人浅薄的理解,无非就是client端接收了

server的闭包后,然后解包,然后根据interface的id 跳到对应函数执行,不懂为啥要搞个libffi?

 

后来调试wayland的代码,发现client注册的回调,也就是用户自己实现的那些个event回调函数,都是通过libffi生成的ffi call调用的。

再结合网上搜集的一些libffi的资料,这才对libffi的作用有了一个较为清晰的认知,这里做一个简单的记录和回顾。

 

谈到libffi,就要提到C语言的动态函数调用。什么是动态函数调用呢,就是运行时才能决定调用什么函数。它的对立面就是静态函数调用,

也就是编译期间就决定好了,某个函数具备完备的声明和定义,编译期间就已经确定好其地址,运行时直接jump. 对动态库的函数调用,虽然编译期间无法确定地址,但是也是在程序装载的时候,resolve 完毕,symbol的地址也就是定了。

这里所说的动态调用是指,程序运行时,dlopen一个库,然后找里面的符号,然后执行。显然dlopen有这个能力,但是dlopen的限制也很大,必须得在找到对应的symbol的时候,把函数地址给一个已知类型的函数指针,然后通过这个函数指针来调用,显然,函数指针的类型包括返回值,参数等都必须在编译期间知道。

那我如果有这样一个场景,需要运行期间才知道我需要调用某个函数,fun, 而且,我提前不知道这个fun的类型,是在运行时,根据通信协议里面的消息才能解析出来这个函数的返回值,参数类型等,那么该怎么办?这就是libffi可以替我们完成的事情

libffi可以在运行时,动态的生成ffi_call, 有了这个能力,wayland就把它放到了基础设计中,用它来根据wayland protocal来生成一个个函数调用。

这里补充一个libffi的使用方法的blog:

 

标签:调用,函数,编译,笔记,wayland,函数调用,libffi
来源: https://www.cnblogs.com/Arnold-Zhang/p/15730069.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有