TLS for windows

前一段时间在linux上简单试了一下TLS,今天在windows平台上再看看TLS,但是今天不去观察TLS在代码中实际的效果,我只要查看生成的PE程序中TLS的状态。如下,先写一段非常简单的代码:

这里面什么都没有做,只是定义了一个变量,然后build,通过CFF查看生成的exe中的section信息:

tls_with

 

 

明显可以看到,这里多了一个.tls的段,如果注释掉这一句“__declspec (thread) static int tlsFlag = 1;”呢,再build观察一下:

tls_without

 

这里需要注意测试源文件是.c文件,如果改成.cpp后缀,直接编译上面的源码生成的结果和第二张图一模一样,都是没有.tls项,此处不太理解,why!不过我的目的不是去分析PE格式,而是要生成一个带有TLS段的exe程序,仅此而已,所以就简单了,在csdn上看到一位学习PE格式的大婶,里面提到了怎么使用TLS(稍后给出网站),所以我们简单的修改一下代码,如下:

其实只添加了一句“#pragma comment(linker,"/INCLUDE:__tls_used")”,然后再build看一下exe的信息:

tls_with_directory

很完美,section里面有.tls段,而且有TLS Directory了,这就是我要的最终exe格式,但是只有这一点还不太够用,还需要验证一下tls的工作,此处直接使用上面大婶的代码,里面有原帖的地址:

基本上没有动太多的脑子,因为我的需求只是验证一下带有TLS的程序在某些情况下能不能工作而已,所以直接从网上看了看资料,就直接拿过来代码用了。既然已经用了,索性将msdn给出的示例代码也转移一份,以备将来查看,这份代码只是描述了tls的正常使用,没有涉及到和PE里面对应的代码段关系,所以只是作为TLS使用参考还可以,不是本次需要的内容:

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注