On Wed, 2009-07-08 at 16:45 +0200, Danny Backx wrote:
> On Wed, 2009-07-08 at 15:21 +0100, Dave Korn wrote:
> > So, how do those addresses relate to where the DLL actually is loaded in
> > memory? I'm assuming not much, given that it crashes, which would imply
> > something had gone very very wrong at the link stage. Where is the DLL
> > actually located in memory? What's in the .o file corresponding to those
> > locations above, and what kind of reloc does it have?
>
> The "very very wrong at the link stage" statement may be accurate. But
> my x86 assembler dates back to the days of the 8088 so I'm guessing a
> bit.
Trying to dig deeper ;-)
The gdb session shows that the last addresses execution passes through
are 0x401083 and 0x401092.
The former of those addresses looks like the start of the constructor
function generated in the C++ compiler (one per source, called
__static_initialization_and_destruction_*, see
gcc-4.4.0/gcc/cp/decl2.c).
0040107d <__Z41__static_initialization_and_destruction_0ii>:
40107d: 55 push %ebp
40107e: 89 e5 mov %esp,%ebp
401080: 83 ec 18 sub $0x18,%esp
401083: 83 7d 08 01 cmpl $0x1,0x8(%ebp)
401087: 75 15 jne 40109e
<__fu2___ZNSt8ios_base4InitC1Ev+0x4>
401089: 81 7d 0c ff ff 00 00 cmpl $0xffff,0xc(%ebp)
401090: 75 0c jne 40109e
<__fu2___ZNSt8ios_base4InitC1Ev+0x4>
401092: c7 04 24 00 40 40 00 movl $0x404000,(%esp)
401099: e8 92 40 00 00 call 405130
<__imp___ZNSt8ios_base4InitC1Ev>
0040109a <__fu2___ZNSt8ios_base4InitC1Ev>:
40109a: 92 xchg %eax,%edx
40109b: 40 inc %eax
40109c: 00 00 add %al,(%eax)
40109e: 83 7d 08 00 cmpl $0x0,0x8(%ebp)
4010a2: 75 15 jne 4010b9
<__fu3___ZNSt8ios_base4InitD1Ev+0x4>
4010a4: 81 7d 0c ff ff 00 00 cmpl $0xffff,0xc(%ebp)
4010ab: 75 0c jne 4010b9
<__fu3___ZNSt8ios_base4InitD1Ev+0x4>
4010ad: c7 04 24 00 40 40 00 movl $0x404000,(%esp)
4010b4: e8 7b 40 00 00 call 405134
<__imp___ZNSt8ios_base4InitD1Ev>
004010b5 <__fu3___ZNSt8ios_base4InitD1Ev>:
4010b5: 7b 40 jnp 4010f7
<__pei386_runtime_relocator+0x3>
4010b7: 00 00 add %al,(%eax)
4010b9: c9 leave
4010ba: c3 ret
The second is inside that function, just before it calls a function at
0x405130, this is the constructor. Note that a bit lower, there is
similar code for the destructor, calling 0x405134.
The symbols shown for these addresses by objdump are __imp followed by a
mangled version of ios_base::Init . The code there is very interesting :
I would expect that executing an "in" statement would fail :-)
00405130 <__imp___ZNSt8ios_base4InitC1Ev>:
405130: e4 51 in $0x51,%al
...
00405134 <__imp___ZNSt8ios_base4InitD1Ev>:
405134: 00 52 00 add %dl,0x0(%edx)
...
This is obviously where it goes wrong.
With my limited knowledge of how ld works and how
src/binutils/ld/pe-dll.c does its thing, I can't say immediately what
should happen here.
The comments at the top of pe-dll.c seem to imply that the stuff at
0x405130 should not be code, but a data structure.
Also when looking at how a call to GetModuleFileName is resolved, it
would appear that the "call 0x405130" statement is wrong, it should be
"call *0x405130".
<<evidence : calling GetModuleFileName>>
40139b: 8d 9d e8 fb ff ff lea -0x418(%ebp),%ebx
4013a1: 89 5c 24 04 mov %ebx,0x4(%esp)
4013a5: c7 04 24 00 00 00 00 movl $0x0,(%esp)
4013ac: e8 b3 02 00 00 call 401664
<_GetModuleFileNameW>
4013b1: 89 c7 mov %eax,%edi
00401664 <_GetModuleFileNameW>:
401664: ff 25 f8 50 40 00 jmp *0x4050f8
40166a: 90 nop
40166b: 90 nop
004050f8 <__imp__GetModuleFileNameW>:
4050f8: 44 inc %esp
4050f9: 51 push %ecx
...
<<end of evidence>>
Suggestions, anyone ?
Danny
pavilion: {309} i386-mingw32ce-gdb hello.exe
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show
copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu
--target=i386-mingw32ce"...
(gdb) target remote ebox:9999
Remote debugging using ebox:9999
[New Thread 88473610]
Error while mapping shared library sections:
\network\x86\libgcc_s_sjlj-1.dll: No such file or directory.
Error while mapping shared library sections:
libstdc++-6.dll: No such file or directory.
Error while mapping shared library sections:
\Windows\coredll.dll: No such file or directory.
Symbol file not found for \network\x86\libgcc_s_sjlj-1.dll
Symbol file not found for libstdc++-6.dll
Symbol file not found for \Windows\coredll.dll
WinMainCRTStartup (hInst=0x545000a, hPrevInst=0x0, lpCmdLine=0x2201fc70,
nCmdShow=5)
at /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/crt3.c:35
35 {
Current language: auto; currently c
(gdb) s
41 _fpreset (); /* Supplied by the runtime
library. */
(gdb)
44 _pei386_runtime_relocator ();
(gdb)
_pei386_runtime_relocator ()
at
/home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/pseudo-reloc.c:33
33 for (r = (runtime_pseudo_reloc*) start; r <
(runtime_pseudo_reloc*) end; r++)
(gdb)
46 }
(gdb)
WinMainCRTStartup (hInst=0x545000a, hPrevInst=0x0, lpCmdLine=0x2201fc70,
nCmdShow=5)
at /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/crt3.c:49
49 __atexit_init();
(gdb)
__atexit_init ()
at /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/atexit.c:65
65 first_atexit = (p_atexit_fn*) malloc (32 * sizeof
(p_atexit_fn));
(gdb)
66 if (first_atexit == NULL ) /* can't allocate memory */
(gdb)
73 *first_atexit = NULL;
(gdb)
74 next_atexit = first_atexit;
(gdb)
76 }
(gdb)
WinMainCRTStartup (hInst=0x545000a, hPrevInst=0x0, lpCmdLine=0x2201fc70,
nCmdShow=5)
at /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/crt3.c:54
54 __gccmain();
(gdb)
__gccmain ()
at /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/gccmain.c:79
79 if (!initialized)
(gdb)
81 initialized = 1;
(gdb)
86 }
(gdb)
__gccmain ()
at /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/gccmain.c:83
83 __mingw_do_global_ctors ();
(gdb)
__mingw_do_global_ctors ()
at /home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/mingw/gccmain.c:40
40 {
(gdb)
41 unsigned long nptrs = (unsigned long) __CTOR_LIST__[0];
(gdb)
49 if (nptrs == -1)
(gdb)
58 for (i = nptrs; i >= 1; i--)
(gdb)
60 __CTOR_LIST__[i] ();
(gdb)
global constructors keyed to main () at hello.C:8
8 }
Current language: auto; currently c++
(gdb)
__static_initialization_and_destruction_0 (__initialize_p=1,
__priority=65535) at hello.C:8
8 }
(gdb) info registers
eax 0x2 2
ecx 0x0 0
edx 0x0 0
ebx 0x1 1
esp 0x2201fb30 0x2201fb30
ebp 0x2201fb48 0x2201fb48
esi 0x401698 4200088
edi 0x2201fc38 570555448
eip 0x401083 0x401083
<__static_initialization_and_destruction_0+6>
eflags 0x3206 [ PF IF #12 #13 ]
cs 0x3b 59
ss 0x43 67
ds 0x40 64
es 0x40 64
fs 0x60 96
gs 0x0 0
(gdb) s
72 static ios_base::Init __ioinit;
(gdb) info registers
eax 0x2 2
ecx 0x0 0
edx 0x0 0
ebx 0x1 1
esp 0x2201fb30 0x2201fb30
ebp 0x2201fb48 0x2201fb48
esi 0x401698 4200088
edi 0x2201fc38 570555448
eip 0x401092 0x401092
<__static_initialization_and_destruction_0+21>
eflags 0x3246 [ PF ZF IF #12 #13 ]
cs 0x3b 59
ss 0x43 67
ds 0x40 64
es 0x40 64
fs 0x60 96
gs 0x0 0
(gdb) s
Program received signal SIGSEGV, Segmentation fault.
0x423517be in ?? ()
(gdb) info registers
eax 0x2 2
ecx 0x0 0
edx 0x0 0
ebx 0x1 1
esp 0x2201fb2c 0x2201fb2c
ebp 0x2201fb48 0x2201fb48
esi 0x401698 4200088
edi 0x2201fc38 570555448
eip 0x423517be 0x423517be
eflags 0x3246 [ PF ZF IF #12 #13 ]
cs 0x3b 59
ss 0x43 67
ds 0x40 64
es 0x40 64
fs 0x60 96
gs 0x0 0
(gdb)
--
Danny Backx ; danny.backx - at - scarlet.be ; http://danny.backx.info
------------------------------------------------------------------------------
_______________________________________________
Cegcc-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/cegcc-devel