zoukankan      html  css  js  c++  java
  • 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:

     http://blog.cnbang.net/tech/3219/

  • 相关阅读:
    64位操作系统安装32位客户端和PL/SQL
    Oracle clob 操作
    Oracle中DBMS_LOB包使用小结
    PLSQL自动断开服务器连接 (转)
    oracle odbc 驱动安装(不安装oracle客户端)
    Broadcom GNSS xxx Geolocaltion Sensor与Windows导航程序的兼容性(转)
    GPS经纬度的表示方法及换算
    odp.net 读写oracle blob字段
    oracle 的数组(转)
    javascript的window.ActiveXObject对象,区别浏览器的方法
  • 原文地址:https://www.cnblogs.com/Arnold-Zhang/p/15730069.html
Copyright © 2011-2022 走看看