定位起始代码
使用gdb查看wine的启动程序:
gdb --args wine notepad
start
layout src
Temporary breakpoint 1, main (argc=2, argv=0xffffcd84) at ../src/loader/main.c:180
可以看到是从loader/main.c:main()
开始执行的。
执行时序
/*
loader/main.c
*/
main(argc, argv,);
handle=load_ntdll();
init_func=dlsym( handle, "__wine_main" );
init_func(argc, argv, environ);
/*
dlls/ntdll/unix/loader.c
*/
__wine_main();
loader_exec();
preloader_exec();
execv();
#0 preloader_exec (argv=argv@entry=0x7d007b50) at ../src/dlls/ntdll/unix/loader.c:689
#1 0xf7cf8ed4 in loader_exec (argv=argv@entry=0x7d007b50, machine=machine@entry=332) at ../src/dlls/ntdll/unix/loader.c:718
#2 0xf7cfb122 in __wine_main (argc=2, argv=0xffffcd84, envp=0xffffcd90) at ../src/dlls/ntdll/unix/loader.c:2380
#3 0x7d001298 in main (argc=<optimized out>, argv=<optimized out>) at ../src/loader/main.c:183
gdb
set follow-exec-mode new
set detach-on-fork off
catch exec
r
wineserver