Browsed by
Category: wine

[wine] 将WindowsPath转为UnixPath的解决方案

[wine] 将WindowsPath转为UnixPath的解决方案

参考这个代码 wine-devel maling list >>Am 07.01.2016 um 09:49 schrieb Jianqiu Zhang: >>> + >>> +pcap_dumper_t* CDECL wine_pcap_dump_open(pcap_t *p, const char *fname) >>> +{ >>> + return pcap_dump_open(p, fname); >>> +} >> >>This can’t work, the wpcap function might be called with fname set to “C:dump.pcap” and the native function will be confused by that. > > Ah, I see, I didn’t take this scheme in to consideration, I will try to use a helper function to convert the fname to…

Read More Read More

setcap wine 遇到的问题解决

setcap wine 遇到的问题解决

之后为了让普通用户也能通过wine访问到网络接口,需要给wine的相关程序(wine-preloader 和 wineserver wine) 一些特权   参考  man capabilities 和 setcap  首先需要给CAP_NET_RAW 权限 这个要给到 wine-preloader 上,不过在设置完这个权限之后,执行 wine XXX.exe 会报错 wine: error while loading shared libraries: libwine.so.1: cannot open shared object file: No such file or directory 这是因为特权模式的程序运行的时候是不会检测到相对路径的lib库的, 具体参考文章如下:http://stackoverflow.com/q/6493846/296473  解决方法在文中已有了 就不赘述了  上述问题解决后,运行wine 会提示  Internal errors- Invalid parameters  , 而且winedbg不可以attach到进程, 这个问题的解决方法是给wineserver(不是wine-preloader)CAP_SYS_PTRACE权限    

__attribute__ in C

__attribute__ in C

__atrribute__ in C Take a look at this code for example (in Cygwin master branch /winsup/cygwin/winsup.h) #include<stdio.h> __attribute__((constructor)) void fun1() { printf(“Hello “); } __attribute__((destructor)) void fun2() { printf(“Worldn”); } int main(void) { return 0; } Then gcc xxx.c and then run the code it will print out “Hello World” ~ So why it works? The code with constructor attribute run before main function and code with destructor attr run after main function The __attribute__ can do more than above…

Read More Read More

Windows 下同步(多线程协调)的实现 的简单解释

Windows 下同步(多线程协调)的实现 的简单解释

Windows下的多个线程之间的通信,是通过各种Object进行的, 目前我只了解到EventObject, 下面简单介绍一下什么是EventObject . 我们可以把各个线程想象成一些不同的流水线,比如制作面包的流水线, 一个线程(流水线)负责制作面包,另一个流水线负责将面包包装好,那么这两个流水线就存在逻辑上的顺序, 即使他们同时工作,包装的如果不等制作面包的制作好,是无法进行的. 在系统里也是这样 两个(或者多个)线程之间有依赖关系, 比如B要在A完成后才可以处理,C要等D E完成之后才能处理. 那么,多个线程之间如何协调好这个关系呢. 这时候Windows就使用EventObject来给各个线程发送信号,EventObject可以有名字也可以没有名字, 带名字的在多线程同步时很常用(这里说明一下 ,多个线程之间协调工作就叫同步), 在多线程同步处理事件的时候 , 首先建立好一系列的EventObject(和其他Object) ,然后 线程A执行开始的时候 将EventObjectA设置为FALSE(没被触发状态) 这时 线程B在等待EventObjectA的信号(就是保持挂起状态,一旦有信号激活就会开始执行) , 然后线程A执行完毕之后 , 就会将EventObjectA设置为TRUE (触发状态) 这时, 由于EventObjectA被触发, 线程B也就同时启动了,然后开始执行线程B,这样就实现了线程之间的同步 有关NtCreateEvent和 EventObject的说明 参见msdn文档 https://msdn.microsoft.com/en-us/library/windows/hardware/ff566423(v=vs.85).aspx NtCreateEvent 的介绍 https://msdn.microsoft.com/en-us/library/windows/desktop/ms682655(v=vs.85).aspx EventObject的介绍

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

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