wayland学习笔记(八) 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: