将libvex移植到Visual Studio编译平台下的经验总结
1. 两难
将libvex从Linux移植到Windows,移植工作聚集于Cross-Compiler,而不是预料的Cross-Platform。
VC++ Compiler到目前为止只支持C89标准,而这个标准规定,变量必须在代码块(即通过大括号包围起来的代码块)的最前面声明,参考
可以将*.c改成*.cpp,但是新的问题又出现了,在C代码中的类型转换是不需要显式写明的,但是C++却不允许这样做。
因此,在下面的选项之间两难:
1. 维持原来的*.c代码,将没有在代码块头部声明的变量,都移到代码块头部声明;
2. 修改为*.cpp代码,显式添加所有的类型转换;
二者都是很枯燥的工作,我最后选择的后者。
2. 怎样通过预定义的宏来判断当前的编译器是不是VC++
#if _MSC_VER && !__INTEL_COMPILER
#else
#endif
3. 需要做哪些移植修改
1. 带变长参数的宏
Gcc支持带变长参数的宏,就如printf一样;但VC++不支持;
修改方法:
#if _MSC_VER && !__INTEL_COMPILER
#define DIP vex_printf
#define DIS vex_sprintf
#else
#define DIP(format, args...) \
if (vex_traceflags & VEX_TRACE_FE) \
vex_printf(format, ## args) #define DIS(buf, format, args...) \
if (vex_traceflags & VEX_TRACE_FE) \
vex_sprintf(buf, format, ## args)
#endif
2. 带自动补全中间值的case项目
Gcc支持自动补全范围的case项目,但是VC++不支持
修改方法:
//case 0xC0 ... 0xC7: /* FADD %st(?),%st(0) */
case 0xC0:
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC4:
case 0xC5:
case 0xC6:
case 0xC7:
3. 数据结构成员的初始化
C支持,C++不支持
修改方法:
#if _MSC_VER && !__INTEL_COMPILER
VexGuestLayout
armGuest_layout
= {
/* Total size of the guest state, in bytes. */
sizeof(VexGuestARMState), /* Describe the stack pointer. */
offsetof(VexGuestARMState,guest_R13),
4, 0,
0, /* Describe the instruction pointer. */
offsetof(VexGuestARMState,guest_R15T),
4, /* Describe any sections to be regarded by Memcheck as
'always-defined'. */
10, /* flags thunk: OP is always defd, whereas DEP1 and DEP2
have to be tracked. See detailed comment in gdefs.h on
meaning of thunk fields. */
{ /* 0 */ ALWAYSDEFD(guest_R15T),
/* 1 */ ALWAYSDEFD(guest_CC_OP),
/* 2 */ ALWAYSDEFD(guest_CC_NDEP),
/* 3 */ ALWAYSDEFD(guest_EMWARN),
/* 4 */ ALWAYSDEFD(guest_TISTART),
/* 5 */ ALWAYSDEFD(guest_TILEN),
/* 6 */ ALWAYSDEFD(guest_NRADDR),
/* 7 */ ALWAYSDEFD(guest_IP_AT_SYSCALL),
/* 8 */ ALWAYSDEFD(guest_TPIDRURO),
/* 9 */ ALWAYSDEFD(guest_ITSTATE)
}
};
#else
VexGuestLayout
armGuest_layout
= {
/* Total size of the guest state, in bytes. */
.total_sizeB = sizeof(VexGuestARMState), /* Describe the stack pointer. */
.offset_SP = offsetof(VexGuestARMState,guest_R13),
.sizeof_SP = 4, /* Describe the instruction pointer. */
.offset_IP = offsetof(VexGuestARMState,guest_R15T),
.sizeof_IP = 4, /* Describe any sections to be regarded by Memcheck as
'always-defined'. */
.n_alwaysDefd = 10, /* flags thunk: OP is always defd, whereas DEP1 and DEP2
have to be tracked. See detailed comment in gdefs.h on
meaning of thunk fields. */
.alwaysDefd
= { /* 0 */ ALWAYSDEFD(guest_R15T),
/* 1 */ ALWAYSDEFD(guest_CC_OP),
/* 2 */ ALWAYSDEFD(guest_CC_NDEP),
/* 3 */ ALWAYSDEFD(guest_EMWARN),
/* 4 */ ALWAYSDEFD(guest_TISTART),
/* 5 */ ALWAYSDEFD(guest_TILEN),
/* 6 */ ALWAYSDEFD(guest_NRADDR),
/* 7 */ ALWAYSDEFD(guest_IP_AT_SYSCALL),
/* 8 */ ALWAYSDEFD(guest_TPIDRURO),
/* 9 */ ALWAYSDEFD(guest_ITSTATE)
}
};
#endif
4. 隐式类型转换
C支持, c++不支持
修改方法:
*arr = (HReg *)LibVEX_Alloc(*nregs * sizeof(HReg));
将libvex移植到Visual Studio编译平台下的经验总结的更多相关文章
- Visual Studio 2013环境下操作vc6/vc7/vc8等低版本平台项目【编译|生成|调试】
现代化的开发环境,微软一直在推出更新换代,我们所处的技术环境在日新月异的变化:不过在中国多数人们一边疲惫的追赶着时代的步伐,一边坚守着自己所获悉所掌握的那些紧吧吧的知本.对技术工具的掌握并非他们所想要 ...
- Visual Studio 编译项目失败,提示找不到文件
博客地址:http://blog.csdn.net/FoxDave 今天碰到了一个蠢问题,虽然咱们正常情况下是遇不到的,但这确实是个应该注意的地方,所以简单记录一下. Visual Studio ...
- Windows 使用 Visual Studio 编译 caffe
说明:最近看 caffe 发现在 github 上下载的源码没有windows版本的,需要自己生成项目文件才能用 Visual Studio 编译,这里记录一下生成Windows项目文件的方法以及编译 ...
- Visual Studio 编译后去掉只读属性
Visual Studio 编译后去掉只读属性 attrib $(TargetPath) -R attrib $(TargetDir)$(TargetName).pdb -R
- Visual Studio 编译Winform程序不生成.vshost.exe和.pdb文件的方法
问题:使用Visual Studio编译工程时,默认设置下,即使选择了「Release」时也会生成扩展名为「.vshost.exe」和「.pdb」的文件. 先解释一下各个文件的作用: .pdb文件: ...
- Visual Studio编译Core程序部署到linux
一.背景 随着微软拥抱开源,推出Net Core框架,目前已经支持跨平台,能部署到Linux.MacOS.Windows等系统上. 下面我们就来分享一下Visual Studio编译好的代码部署到Li ...
- 后台大哥请进一步:使用Visual Studio编译scss和souce map实现前后端的完美结合
title: 后台大哥请进一步:使用Visual Studio编译scss和souce map实现前后端的完美结合 date: 2020-06-28 sidebarDepth: 2 tags: win ...
- Visual Studio 项目目录下的bin目录和 obj目录
一.Bin目录 Visual Studio 编译时,在bin 目录下有debug 和 release 目录. 1.Debug: 通常称为调试版本,它包含调试信息,所以要比Release 版本大很多(可 ...
- 开发工具Visual Studio使用相关知识和经验的碎片化记录
开发工具Visual Studio使用相关知识和经验的碎片化记录 1.Visual Studio提示"无法启动IIS Express Web服务器"的解决方法 有时,在使用Visu ...
随机推荐
- How to show out three rows from the same databand On A4?
How to show out three rows from the same databand On A4? Quote Post by DoraHuang » Tue Mar 13, 2018 ...
- appium常见问题04_查看andriod内置浏览器webview版本
方法一:手机上设置中查看 设置-->应用程序管理-->全部-->Android System WebView 方法二:adb指令查看(前提,已安装android sdk环境) 1,w ...
- JavaScript HashTable
function HashTable() { var loseHashCode = function(key) { var hash = 0; for (var i = 0; i < key.l ...
- select 和 order by
select 的优先级要高于order by,相当于是select先创建了一个临时表,再通过临时表去排序.所以,对于一些sum()的汇总,在进行排序,实际是排序的select后的字段,而不是表里的那个 ...
- 【题解】LCIS
题目描述 给定两个整数序列,写一个程序求它们的最长上升公共子序列. 输入格式 每个序列用两行表示,第一行是长度L,第二行是该序列. 输出格式 在第一行,输出该LCIS的长度.第二行,输出该LCIS. ...
- 【转载】MySQL查询当天0点,昨天时间
转载自:https://blog.csdn.net/qq_22158021/article/details/78800299 今天是 SELECT NOW();-- 2015-09-28 13:48: ...
- IO复用: select 和poll 到epoll
linux 提供了select.poll和epoll三种接口来实现多路IO复用.下面总结下这三种接口. select 该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经 ...
- python5数据存储
1 txt文件存储 正常调用文件python文件操作 https://www.cnblogs.com/x2x3/p/9979919.html 2 json文件存储 在JavaScript语言中,一切都 ...
- bi包
闭包是函数式编程的概念 闭包的定义:由函数极其封闭的自由变量组成的集合体. 其实每一个函数都是一个闭包 特点:函数中嵌套函数. 在返回的时候不仅返回函数本身,而且返回内部函数的值,关键词‘释放’ 闭包 ...
- python 字符串中替换字符
今天本来打算写个程序,替换字符串中固定的一个字符:将<全部替换成回车'\n' 于是,我写成这样 s='sdjj<ddd<denj,>' for x in s: if x=='& ...