Tuesday, January 31, 2012

MDL notes

two very good references:

http://msdn.microsoft.com/en-us/windows/hardware/gg463193

http://www.haogongju.net/art/1156109

Sunday, January 29, 2012

WinSock Kernel

Winsock Kernel http://msdn.microsoft.com/en-us/library/windows/hardware/ff571084(v=vs.85).aspx Sample code: http://www.rohitab.com/discuss/topic/37876-winsock-kernel/ http://hi.baidu.com/kernelkit/blog/item/e8a93060e1ad6a41eaf8f856.html

Monday, January 02, 2012

[Linux]静态库,动态库

.o, .a, .so 这些的区别
Static, Shared Dynamic and Loadable Linux Libraries
Shared libraries and static libraries
Creating a shared and static library with the gnu compiler [gcc]

创建静态库(.a)
比如为了把foo1.o, foo2.o这两个obj文件打包成一个静态库叫做foo.a
$ gcc -Wall -c foo1.c foo2.c
$ ar -cvq libfoo.a foo1.o foo2.o
创建动态库(.so)
首先用-fPIC选项告诉gcc生成position independant code的.o文件
$ gcc -Wall -fPIC -c foo1.c foo2.c
接着使用-shared选项生成.so文件
$ gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0.1  foo1.o foo2.o
使用库(.a,.so)
假设生成的libfoo.a或者libfoo.so都在/path/to/libfoo这个路径下,可以通过"-L/path/to/libfoo"这个选项告诉gcc去这个路径下去寻找需要的库.此外再通过-lfoo这个选项告诉gcc去寻找libfoo.a或者libfoo.so.
$ gcc -Wall -L/path/to/libfoo your-program.c -lfoo -o your-program
默认情况下/usr/lib, /usr/local/lib这个几个路径一般会被首先查找.如果需要gcc去其他默认路径下查找(比如/path/to/libfoo),也可以通过把/path/to/libfoo添加LD_LIBRARY_PATH环境变量中
强制使用静态库(.a)
如果在/path/to/libfoo下同时存在libfoo.a和libfoo.so, libfoo.so会被优先使用.可以用-static选项强制gcc避免使用动态库
$ gcc -Wall -static -L/path/to/libfoo your-program.c -lfoo -o your-program
libtool
configure关于静态动态库的参数
  • --enable-shared: 编译动态库(默认为yes)
  • --enable-static: 编译静态库(默认为no)
有时"--enable-static"会以尝试静态的方式编译所有dependent的库,产生undefined reference这样的错误.
$ ./configure --enable-static
warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_free':
(.text+0x4f): undefined reference to `inflateEnd'
可以以--enable-static=libfoo这样的方式指定gcc只以static的方式编译libfoo.其他依赖的库还是以默认的shared方式编译(http://sourceware.org/autobook/autobook/autobook_85.html)
$ ./configure --enable-static=libfoo
libtool在link模式下有选项:
  • -shared
  • -static
  • -all-static