This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Need help figuring out DLL load problem


On Thu, 2009-07-30 at 20:56 +0100, Dave Korn wrote:
> Danny Backx wrote:
> 
> > The Import Tables (interpreted .idata section contents)
> >  vma:            Hint    Time      Forward  DLL       First
> >                  Table   Stamp     Chain    Name      Thunk
> 
> >  00004014       000040c4 00000000 00000000 000042b0 00004130
> > 
> >         DLL Name: libstdc++-6.dll
> >         vma:  Hint/Ord Member-Name Bound-To
> >         41e4     2744  _ZNSt8ios_base4InitC1Ev
> >         4200     2746  _ZNSt8ios_base4InitD1Ev
> >         421c     2984  _ZSt4cout
> >         4228     3060
> > _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
> 
> >  00004050       000040e8 00000000 00000000 000042b0 0000109a
> > 
> >         DLL Name: libstdc++-6.dll
> >         vma:  Hint/Ord Member-Name Bound-To
> >         41e4     2744  _ZNSt8ios_base4InitC1Ev
> 
>   That confirms my theory.  The call at 0x00401099 should go to
> _imp___ZNSt8ios_base4InitC1Ev at 0x404130, but then the auto-import fixup
> relocation goes and gets applied to it.  The resulting address should be the sum
> of the real address and the import stub address, so
> 
>   0x423517be = _ZNSt8ios_base4InitC1Ev + 0x404130
> 
> or in other words, _ZNSt8ios_base4InitC1Ev = 0x41F4D68E, which is inside the
> DLL's address range as it should be.
> 
>   Your mission then is to figure out why LD is generating an auto-import fixup
> entry, when this is not a data reference.  Take a look at pe_find_data_imports()
> in ld/emultempl/pe.em, that's where they all get generated.

Maybe you can help me understand what's going on, I lack knowledge.

I am including three pieces of information :
1. diffs I applied to emultempl/pe.em to be more verbose
2. output of that from the ill-behaving i386-mingw32ce-ld
3. output of that from arm-mingw32ce-ld which does work

Commands used :
arm-mingw32ce-g++ -c -o hello2arm.o hello.C
i386-mingw32ce-g++ -c -o hello2.o hello.C
/home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/build-x86-mingw32ce/binutils/ld/ld-new \
        --enable-extra-pe-debug \
        -Bdynamic -o hello2.exe \
        /opt/x86mingw32ce/i386-mingw32ce/lib/crt3.o \
        -L/opt/x86mingw32ce/lib/gcc/i386-mingw32ce/4.4.0 \
        -L/opt/x86mingw32ce/i386-mingw32ce/lib --enable-auto-import
hello2.o \
        -lstdc++ -lmingw32 -lgcc_s -lgcc -lceoldname -lmingwex -lcoredll
\
        -lmingw32 -lgcc_s -lgcc -lceoldname -lmingwex \
        /opt/x86mingw32ce/lib/gcc/i386-mingw32ce/4.4.0/crtend.o \
        >&ld.out.i386
/home/danny/src/cegcc/svn.sf.net/cegcc/trunk/cegcc/src/build-mingw32ce/binutils/ld/ld-new \
        --enable-extra-pe-debug \
        -Bdynamic -o hello2arm.exe \
        /opt/mingw32ce/arm-mingw32ce/lib/crt3.o \
        -L/opt/mingw32ce/lib/gcc/arm-mingw32ce/4.4.0 \
        -L/opt/mingw32ce/arm-mingw32ce/lib --enable-auto-import
hello2arm.o \
        -lstdc++ -lmingw32 -lgcc_s -lgcc -lceoldname -lmingwex -lcoredll
\
        -lmingw32 -lgcc_s -lgcc -lceoldname -lmingwex \
        /opt/mingw32ce/lib/gcc/arm-mingw32ce/4.4.0/crtend.o \
        >&ld.out.arm


What confuses me is that the ld output files appear to indicate
different input, see the first couple of lines in the output (before
gld_arm_wince_pe_after_open and gld_i386pe_after_open).

This appears to indicate different input symbol lists. The difference
contains one of the symbols we're chasing : __ZNSt8ios_base4InitC1Ev .

Is this meaningful, or is another part of the output key to the answer ?

	Danny

-- 
Danny Backx ; danny.backx - at - scarlet.be ; http://danny.backx.info

Attachment: ld.out.arm
Description: Text document

Attachment: ld.out.i386
Description: Text document

Index: emultempl/pe.em
===================================================================
--- emultempl/pe.em	(revision 1225)
+++ emultempl/pe.em	(working copy)
@@ -931,16 +931,28 @@
   return 1;
 }
 
+#define	BFD_TP(x)	\
+	(x == bfd_link_hash_new) ? "new" : \
+	(x == bfd_link_hash_undefined) ? "undefined" : \
+	(x == bfd_link_hash_undefweak) ? "undefweak" : \
+	(x == bfd_link_hash_defined) ? "defined" : \
+	(x == bfd_link_hash_defweak) ? "defweak" : \
+	(x == bfd_link_hash_common) ? "common" : \
+	(x == bfd_link_hash_indirect) ? "indirect" : \
+	(x == bfd_link_hash_warning) ? "warning" : "??"
+
 static void
 pe_find_data_imports (void)
 {
   struct bfd_link_hash_entry *undef, *sym;
 
+ fprintf(stderr, "Yow (pe_find_data_imports) link_info.pei386_auto_import %d\n", link_info.pei386_auto_import);
   if (link_info.pei386_auto_import == 0)
     return;
 
   for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next)
     {
+ fprintf(stderr, "Yow sym {%s} undef->type %d (%s)\n", undef->root.string, undef->type, BFD_TP(undef->type));
       if (undef->type == bfd_link_hash_undefined)
 	{
 	  /* C++ symbols are *long*.  */
@@ -959,6 +971,7 @@
 	      asymbol **symbols;
 	      int nsyms, i;
 
+ fprintf(stderr, "Yow sym {%s} link_info.pei386_auto_import %d\n", undef->root.string, link_info.pei386_auto_import);
 	      if (link_info.pei386_auto_import == -1)
 		{
 		  static bfd_boolean warned = FALSE;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]