libtcc源码分析(一)概览

关于libtcc

.... libtcc的源码仓库:libtcc

libtcc是一个微型的C编译器,它可以将C源码直接编译成机器码,并且通过libtcc提供的接口函数,在宿主程序里可以很方便的获取到libtcc编译后的函数或变量地址,这样相比其他脚本语言,libtcc就具有了以下的特点:

  • 脚本完全使用c语言编写,对大多数用c语言入门的人来说,几乎没有任何学习成本,但是同样,处理字符串会变得和c一样麻烦
  • 速度,libtcc是直接将源码文件(或者可以说脚本文件)直接编译成机器码的,在编译一次后,再执行脚本就会和Native Code一样快
  • 可以很方便的使用几乎所有的c动态链接库
  • 使用tcc_add_symbol函数可以将宿主程序的变量或函数暴漏给libtcc,使用tcc_get_symbol函数可以将脚本编译后的变量或函数暴漏给宿主程序;在libtcc和宿主程序中使用暴漏处理的符号和使用动态链接库一样方便。

libtcc存在的问题:

  • libtcc不可以在多线程环境下使用
  • 不可以同时使用多个TccState(源码内用到了大量的全局变量)
  • 其他bug见libtcc源码包中的TODO文件

使用libtcc

编译

在windows下直接运行win32/build-tcc.bat即可

使用

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define PAUSE system("pause")
  4. #include "../tinycc/libtcc.h"
  5. const char szCode[] = "\n"
  6. //"//#define MACRO(a, b c) (a+b+c)\n" ///bug1
  7. //"double array[10][20];"
  8. "double add(double a, long b)\n"
  9. "{\n"
  10. " return a+b;\n"
  11. "}\n";
  12. typedef int (*f_iii)(int, int);
  13. void error_in_tcc(void *opaque, const char *str)
  14. {
  15. printf(__FUNCTION__": %s\n", str);
  16. }
  17. int main()
  18. {
  19. int nRet = 0;
  20. TCCState* s1 = tcc_new();
  21. tcc_set_error_func(s1, NULL, error_in_tcc);
  22. tcc_add_library_path(s1, "E:\\learn\\libtcc\\tinycc\\win32\\lib");
  23. //tcc_define_symbol(s1, "MACRO1(a, b)", "b ## a");
  24. //tcc_define_symbol(s1, "MACRO0(a, b c)", "(a+b+c)");
  25. //tcc_set_output_type(s1, TCC_OUTPUT_MEMORY);
  26. nRet = tcc_compile_string(s1, szCode);
  27. if (nRet == -1)
  28. {
  29. printf("compile failed!\n");
  30. PAUSE;
  31. return nRet;
  32. }
  33. tcc_relocate(s1, TCC_RELOCATE_AUTO);
  34. f_iii f = (f_iii)tcc_get_symbol(s1, "add");
  35. if (f == NULL)
  36. {
  37. printf("find symbol failed\n");
  38. PAUSE;
  39. return nRet;
  40. }
  41. int c = f(10, 20);
  42. printf("c = %d\n", c);
  43. PAUSE;
  44. return 0;
  45. }

参考文档

来自为知笔记(Wiz)

时间: 2024-10-14 03:59:55

libtcc源码分析(一)概览的相关文章

【Spring源码分析】Bean加载流程概览

代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已,Spring的加载过程相对是不太透明的,不太好去找加载的代码入口. 下面有很简单的一段代码可以作为Spring代码加载的入口: 1 ApplicationContext ac = new Clas

SpringMVC源码分析(3)DispatcherServlet的请求处理流程

<SpringMVC源码分析(1)标签解析>:介绍了解析过程中,初始化若干组件. <SpringMVC源码分析(2)DispatcherServlet的初始化>:初始化DispatcherServlet的多个组件. 本文继续分析DispatcherServlet解析请求的过程. 概览 ①:DispatcherServlet是springmvc中的前端控制器(front controller),负责接收request并将request转发给对应的处理组件. ②:HanlerMappi

插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑

请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52258434 在了解系统的activity,service,broadcastReceiver的启动过程后,今天将分析下360 DroidPlugin是如何预注册占坑的?本篇文章主要分析Activity预注册占坑,Activity占了坑后又是什么时候开始瞒天过海欺骗AMS的?先看下Agenda: AndroidMainfest.xml中概览 Activity中关键方

计划在CSDN学院推出系列视频课程《源码分析教程5部曲》

?? 计划在CSDN学院推出系列视频课程<源码分析教程5部曲> 源码分析教程5部曲之1--漫游C语言 源码分析教程5部曲之2--C标准库概览 源码分析教程5部曲之3--libevent源码分析 源码分析教程5部曲之4--memcached源码分析 源码分析教程5部曲之5--redis源码分析

【Spring源码分析】配置文件读取流程

前言 Spring配置文件读取流程本来是和http://www.cnblogs.com/xrq730/p/6285358.html一文放在一起的,这两天在看Spring自定义标签的时候,感觉对Spring配置文件读取流程还是研究得不够,因此将Spring配置文件读取流程部分从之前的文章拆出来单独成为一文. 为了看一下Spring配置文件加载流程,先定义一个bean.xml: 1 <?xml version="1.0" encoding="UTF-8"?>

插件开发之360 DroidPlugin源码分析(五)Service预注册占坑

请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52264977 在了解系统的activity,service,broadcastReceiver的启动过程后,今天将分析下360 DroidPlugin是如何预注册占坑的?本篇文章主要分析Service预注册占坑,Service占了坑后又是什么时候开始瞒天过海欺骗AMS的?先看下Agenda: AndroidMainfest.xml中概览 Service中关键方法被h

LinkedHashMap 源码分析

LinkedHashMap 源码分析 1. 基本结构 1. 实现 实现的接口是 Map 2. 继承 ?? 继承的是 HashMap 这个就比较熟悉了,事实上我们会看到 LinkedHashMap 代码量非常的少,主要就是因为他继承的 HashMap ,继承了大多数的操作. 仔细一点的都会发现 HashMap 里面有非常多的空白方法,这些方法其实是模板方法,为了让继承 HashMap 的类重写一些自己的特性.而不破坏代码结构. 3. 数据域 1. 基本字段 ?? 在 HashMap 的基础上他添加

ReentrantLock 与 AQS 源码分析

ReentrantLock 与 AQS 源码分析 1. 基本结构 ?? 重入锁 ReetrantLock,JDK 1.5新增的类,作用与synchronized关键字相当,但比synchronized更加灵活.ReetrantLock本身也是一种支持重进入的锁,即该锁可以支持一个线程对资源重复加锁,但是加锁多少次,就必须解锁多少次,这样才可以成功释放锁. 1. 继承 没有继承任何类,因为很多操作都使用了组合完成. 2. 实现 Lock, java.io.Serializable ??这里着重介绍

【精】EOS智能合约:system系统合约源码分析

系统合约在链启动阶段就会被部署,是因为系统合约赋予了EOS链资源.命名拍卖.基础数据准备.生产者信息.投票等能力.本篇文章将会从源码角度详细研究system合约. 关键字:EOS,eosio.system,智能合约,name类型,native.hpp,newaccount,bidname,core token init,onblock,更新已入选生产节点 eosio.system 概览 笔者使用的IDE是VScode,首先来看eosio.system的源码结构.如下图所示. 本文分析的源码来自于