URN Logo
UNIX Resources » Linux » China Linux Forum » CPU 与 编译器 » 8 » 问一个关于动态编译的问题
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
问一个关于动态编译的问题
问一个关于动态编译的问题 - ACp [2005-06-24 13:58 | 216 byte(s)]
 
Re: 问一个关于动态编译的问题 - teawater [2005-06-24 14:20 | 120 byte(s)]
 
Re: 问一个关于动态编译的问题 - ACp [2005-06-24 16:15 | 149 byte(s)]
 
Re: 问一个关于动态编译的问题 - teawater [2005-06-24 16:36 | 4,113 byte(s)]
 
Re: 问一个关于动态编译的问题 - ACp [2005-06-24 17:36 | 127 byte(s)]
 
Re: 问一个关于动态编译的问题 - teawater [2005-06-24 17:45 | 40 byte(s)]
 
Re: 问一个关于动态编译的问题 - ACp [2005-06-24 17:31 | 44 byte(s)]
 
Subject: 问一个关于动态编译的问题
Author: ACp    Posted: 2005-06-24 13:58    Length: 216 byte(s)
[Original] [Print] [Top]
我理解的动态编译是

把bytecode转换为等同操作系统上的汇编码,在调用汇编器,编译成操作系统可执行的格式,如elf.
不知道是否准确.?

这样想来jit和hotspot都需要一个汇编器?
----
OnlyPc
[Original] [Print] [Top]
Subject: Re: 问一个关于动态编译的问题
Author: teawater    Posted: 2005-06-24 14:20    Length: 120 byte(s)
[Original] [Print] [Top]
你说的方法我觉得不象是动态编译 好像是静态了

直接翻译成本地代码执行不就OK了 这种东西好像用不上汇编器吧
----
读了这么多年的书 还是觉得幼儿园好混
[Original] [Print] [Top]
Subject: Re: 问一个关于动态编译的问题
Author: ACp    Posted: 2005-06-24 16:15    Length: 149 byte(s)
[Original] [Print] [Top]
谢谢。

比如在linux下,
是否是翻译成elf格式,然后执行?调用系统API执行?
能大概讲讲流程和调了什么系统API吗?
----
OnlyPc
[Original] [Print] [Top]
Subject: Re: 问一个关于动态编译的问题
Author: teawater    Posted: 2005-06-24 16:36    Length: 4,113 byte(s)
[Original] [Print] [Top]
是否是翻译成elf格式,然后执行?调用系统API执行?

为什么要翻译成elf呢?给你一个我写的例子吧


#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <limits.h>
#include <sys/mman.h>
#include <stdint.h>

typedef struct test_s {
uint32_t a;
uint32_t b;
uint32_t c;
struct test_s *bp;
}test_t;

#define AREG0 "ebp"
#define AREG1 "ebx"
#define AREG2 "esi"
#define AREG3 "edi"

register test_t *st asm("ebp");
register uint32_t T0 asm("ebx");
register uint32_t T1 asm("esi");
register uint32_t T2 asm("edi");

#define wmb() __asm__ __volatile__ ("": : :"memory")
#define OP_BEGIN(f) __asm__ __volatile__ ("jmp
."f"_teawater_op_end ""."f"_teawater_op_begin: ")
#define OP_END(f) __asm__ __volatile__ ("."f"_teawater_op_end: ""movl
$."f"_teawater_op_begin,%0 ""movl $."f"_teawater_op_end,%1 ":"=g"(begin),
"=g"(end));

#define CBIT_SHIFT 29
#define CBIT ((unsigned)1L << CBIT_SHIFT)

test_t tmp;
void (*gen_func)(void);

volatile uint32_t pfun;

uint32_t
ldr(test_t * state,uint32_t addr)
{
printf("ldr addr:%d ",addr);

return(2315);
}

void
str(test_t * state,uint32_t addr,uint32_t data)
{
printf("str addr:%d data:%d ",addr,data);
}

int
main(int argc,char *argv[],char *envp[])
{
unsigned int begin=0,end=0;

OP_BEGIN("main");
T0 = 5873;

//T2 = ldr(st, T0);
__asm__ __volatile__ ("subl $0x8, %esp");
__asm__ __volatile__ ("push %"AREG1);
__asm__ __volatile__ ("push %"AREG0);
pfun = (uint32_t)ldr;
__asm__ __volatile__ ("call *pfun");
__asm__ __volatile__ ("addl $0x10, %esp");
__asm__ __volatile__ ("movl %eax, %"AREG3);

T1 = 6578;

//str(st, T1, T2)
__asm__ __volatile__ ("subl $0x4, %esp");
__asm__ __volatile__ ("push %"AREG3);
__asm__ __volatile__ ("push %"AREG2);
__asm__ __volatile__ ("push %"AREG0);
pfun = (uint32_t)str;
__asm__ __volatile__ ("call *pfun");
__asm__ __volatile__ ("addl $0x10, %esp");

__asm__ __volatile__ ("ret");
OP_END("main");

gen_func=mmap( NULL,1024,PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_ANONYMOUS,0,0);
if(gen_func== MAP_FAILED) {
perror("mmap");
return(-1);
}
memcpy(gen_func,(void *)begin,end-begin);

tmp.a=123;

tmp.bp=st;
st=&tmp;
gen_func();
st=tmp.bp;

munmap(gen_func,1024);

return(0);
}


OP_BEGIN("main");和OP_END("main");之间的部分就假定是你翻译以后的本地代码
gen_func();是对其的执行过程
不过提一下这只是我自己对动态翻译的想法 思想来自qemu
你提到的java虚拟机的具体实现形式我没有仔细了解过
----
读了这么多年的书 还是觉得幼儿园好混
[Original] [Print] [Top]
Subject: Re: 问一个关于动态编译的问题
Author: ACp    Posted: 2005-06-24 17:31    Length: 44 byte(s)
[Original] [Print] [Top]
太谢谢了!.
我仔细看看.
----
OnlyPc
[Original] [Print] [Top]
Subject: Re: 问一个关于动态编译的问题
Author: ACp    Posted: 2005-06-24 17:36    Length: 127 byte(s)
[Original] [Print] [Top]
还没仔细看,不过我大概明白了.
是采用内联汇编的方式.
每个bytecode都采用汇编代码实现一边.

----
OnlyPc
[Original] [Print] [Top]
Subject: Re: 问一个关于动态编译的问题
Author: teawater    Posted: 2005-06-24 17:45    Length: 40 byte(s)
[Original] [Print] [Top]
主要还是用C 因为用汇编阅读性移植性都不好
----
读了这么多年的书 还是觉得幼儿园好混
[Original] [Print] [Top]
« Previous thread
error when installing gcc4.0!
CPU 与 编译器
8
Next thread »
请教各位,与重定位有关......
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:47:27, cost 0.043215036392212 ms.