Browsed by
Month: August 2015

mingw 和 MSYS 的区别

mingw 和 MSYS 的区别

最近在wine下使用msys和mingw进行一些交叉编译和测试0.0 对于什么时候用msys的shell 什么时候用mingw 有些困惑 ,现在大致明白了二者的区别 ,在此总结一下. mingw实际上是minimalist GNU for windows的缩写 ,也就是mingw提供了一个简化的GNU开发组件(如automake gcc 等) 是gcc 和 gnu binutils 在Windows上的移植,这些程序可以直接在Windows的环境下运行 他们依赖的是msvcrt.dll这些Windows下系统自带的库,不借助外部库就可以使用 . msys是Minimal SYStem 的缩写 ,他提供了调用Linux下的系统函数 (如 open flock等)的一个集合 , 因此msys可以用来编译原生的Linux上的代码 , 但是mingw不可以,因为mingw内没有提供调用Linux系统函数的功能,不过相应的,运行在msys下编译好的具有POSIX C代码的可执行程序的时候 ,需要加载msys自己的dll , 因此这个程序不能独立的在windows系统下运行 而需要依赖msys的dll 如果想要验证我的说法的话 , 可以在自己机器上先配置好msys32 安装好 ,然后 首先在MSYS下编译一个有POSIX C代码的程序 编译为 exe格式 ,然后 在Windows的资源管理器中找到这个程序直接执行,  你会发现这个程序执行不了 错误是需要MSYS的dll  , 这样就验证了我的第二条总结 . 同样的,将这段代码带到mingw下命令行下, 然后用mingw的编译器进行编译 , 你会发现编译出问题 编译器找不到POSIX C的函数的头 ,如果你将header文件人为安装好,那么链接器会出错 , 找不到对POSIX C函数的定义 . 因此验证了我总结的第一条   关于如何安装mingw msys 在Windows上 ,很多blog都已经说明了这里不再赘述,查看官方文档或者查看blog都可以解决这个问题

gdb 下调试多线程

gdb 下调试多线程

最近接触的工作需要多线程的一些知识才能完成,而以前没有多线程相关知识,现在进行一些简单的学习和研究.本文内容偏向实践,对于想要了解原理的请去看计算机线程方面的资料和书籍. 1.gdb下调试多进程代码的注意事项 最近在调试这样一段代码的时候, 由于我不具备任何多线程的知识,导致我在找错误的时候出现了严重的问题,代码如下: /*********************************************************************** * This is a STC that causes the following error on my test machine: * NtCreateEvent(lock): 0xC0000035 * * It tries to use flock() for file locking. It creates a temporary * file, the uses fork to spawn a number of children. Each child opens * the file, then repeatedly uses flock to lock and unlock it. * * This test was extracted from the APR test suite. * * Compile: gcc -Wall -o stc-flock-fork…

Read More Read More

CSAPP Linking 学习总结

CSAPP Linking 学习总结

1.一个C语言程序是如何被编译成为可执行程序的 首先 通过C preprocessor 将C语言代码中包括的头文件都写入代码 生产 main.i文件 然后main.i的代码经过编译器 编译为汇编代码 main.s 然后main.s 的代码再经过汇编语言编译器 翻译为机器码的obj(Relocatable Object Files)文件main.o 这时候编译器的任务已经完成了 ,下一步是由链接器,将main.o,以及main.o依赖的所有obj文件 链接成为一个可执行文件, 生成了 a.out文件(静态链接) 2.什么是静态链接(由于很多词语涉及专业术语,专业术语用英语描述) 链接的过程分为两个子过程: Symbol Resoultion 和 Relocation. 下面概括一下两个过程: 2.1 Symbol Resolution  将每个定义好的(Relocatable Object File 中的)符号分配唯一的一个名称 , 举个例子说明一下, 如果有两个C语言文件 需要被链接成一个可执行的文件, 并且在a.c里有一个全局变量 声明 int counter, 在另一个文件b.c里也有同样的一个声明, 这时将两个a.o b.o文件链接为一个可执行文件的时候,就会给两个文件的counter分配不同的名字, 保证每个符号都有唯一的一个名字与之对应 2.2 Relocation 将每个Relocatable Object File 链接到的地址(如函数调用时的地址) 修正为正确的值. 同样举例来说明,在编译如下程序的时候 #include”vecAdd.h” int main(void) { vec a; vec b; a.x = 2; b.x = 3; a.y = 1; b.y = -1; vec c = Add_vec(a,b); return 0;…

Read More Read More

Wine 调试bug总结(MSYS2篇)

Wine 调试bug总结(MSYS2篇)

我将如何调试MSYS2中的某个开源程序的bug的过程总结下来,提供给需要的人 1.配置好环境 – 获得wine-staging的源码 * clone最新的wine代码 * clone wine-staging的代码 * 在wine-staging下使用 patchinstall.sh脚本 将wine-staging的改动应用到wine的代码树上 – 编译并安装wine * 安装编译wine需要的库文件(参见Winehq的官方资料) * configure并且编译安装代码 2.利用自己配置好的环境重现bug 注意一定要下载正确版本的代码进行编译3.下载要debug的软件安装的源码并且编译成有符号表的程序 在 gdb下调试 利用step in 和 next 等命令 ,找出bug发生的地方(就是出现fault 的那个点) -在MSYS2下git clone不可以用 因此需在Linux下进行某些代码的clone 然后再makepkg的时候i记得加上 –noextract 参数 – 学习PKGBUILD的语法和写法 – 学习makepkg 等指令 ( 如果不能通过checksum checkpgp 就用 –skippgpcheck 和 –skipchecksums 跳过) 4.阅读该程序的源代码 , 从bug发生的点向上找, 找出问题所在 , 定位到函数内, ( 如果bug是因为SIGSEGV , 那么找出哪个变量的访问发生了SIGSEGV, 并且确定出何时这个变量不能被access了) 5.通过搜集到的信息写出POSIX C 的测试样例 重现此bug (此时应该结合Google man page 以及各种资料 找出你要使用的函数的用法,以及作用) 7.进一步研究自己写好的测试样例, 用 RELAY日志把程序运行时的系统日志收集到 –  根据要记录的日志的模块的不同 WINEDEBUG后加不同的参数 , 不过所有的都要 WINEDEBUG=+relay,+tid,+server , 而且要注意…

Read More Read More