On Wed, 2009-12-30 at 00:44 +0100, Danny Backx wrote:
> On Tue, 2009-12-29 at 18:34 +0000, Pedro Alves wrote:
> > My knee jerk reaction is: you could try a first step at checking if it's
> > a problem with loader applied relocations, or, if it's a runtime,
> > post loader problem.  Replace your debug '#if 0' by, say,
> > 
> > at global scope:
> > volatile int print_base = 0;
> > 
> > {
> > ...
> >   if (print_base)
> >     wsprintf(msg, L"Ptr %p", &__U(_image_base__));
> >   wsprintf(msg, L"Ptrs %p %p", &__RUNTIME_PSEUDO_RELOC_LIST__,
> >     &__RUNTIME_PSEUDO_RELOC_LIST_END__);
> > }
> > 
> > And see if that loads and runs.  Then try with print_base set to 1.
> > Build without optimizations.
> 
> In both cases, the output is the same :
> 
> LoadLibrary(lib5bb.dll) : cannot load DLL -> error 1114
> 
> I must admit I've been suspicious about the relocations, I guess this
> confirms it.

I've looked further, I'm puzzled.

I created yet another small test (and set image-base to a higher value,
see the other discussion, just for fun).

I checked all the relocations : the table vs. the assembler. They all
appear to make sense. They're usually a couple of words between two
functions (in the .text segment) that are pointers to something in
another segment. A string literal for instance.

I've enclosed the assembler output of a _pei386_runtime_relocator with
the offending lines compiled in :

void
_pei386_runtime_relocator ()
{
  static int was_init = 0;

  if (was_init)
    return;
  ++was_init;

  {
    wchar_t msg[64] = L"Yow";
    MessageBoxW(0, msg, L"_pei386_runtime_relocator", 0);
  }
    do_pseudo_reloc (&__RUNTIME_PSEUDO_RELOC_LIST__,
                     &__RUNTIME_PSEUDO_RELOC_LIST_END__,
                     &__U(_image_base__));
}

The MessageBoxW call is very visible in the assembler output, and it
provides examples for what the relocations look like. The
do_pseudo_reloc call with its parameters is also there. I cannot see a
problem with it, but it does cause the application to fail !

Help ?

        Danny

0100146c <_pei386_runtime_relocator>:
 100146c:       e92d4800        push    {fp, lr}
 1001470:       e28db004        add     fp, sp, #4
 1001474:       e24dd080        sub     sp, sp, #128    ; 0x80
 1001478:       e59f307c        ldr     r3, [pc, #124]  ; 10014fc
<_pei386_runtime_relocator+0x90>
 100147c:       e5933000        ldr     r3, [r3]
 1001480:       e3530000        cmp     r3, #0
 1001484:       1a000019        bne     10014f0
<_pei386_runtime_relocator+0x84>
 1001488:       e59f306c        ldr     r3, [pc, #108]  ; 10014fc
<_pei386_runtime_relocator+0x90>
 100148c:       e5933000        ldr     r3, [r3]
 1001490:       e2832001        add     r2, r3, #1
 1001494:       e59f3060        ldr     r3, [pc, #96]   ; 10014fc
<_pei386_runtime_relocator+0x90>
 1001498:       e5832000        str     r2, [r3]
 100149c:       e59f205c        ldr     r2, [pc, #92]   ; 1001500
<_pei386_runtime_relocator+0x94>
 10014a0:       e24b3084        sub     r3, fp, #132    ; 0x84
 10014a4:       e8920003        ldm     r2, {r0, r1}
 10014a8:       e8830003        stm     r3, {r0, r1}
 10014ac:       e24b207c        sub     r2, fp, #124    ; 0x7c
 10014b0:       e3a03078        mov     r3, #120        ; 0x78
 10014b4:       e1a00002        mov     r0, r2
 10014b8:       e3a01000        mov     r1, #0
 10014bc:       e1a02003        mov     r2, r3
 10014c0:       eb0000d9        bl      100182c <memset>
 10014c4:       e24b3084        sub     r3, fp, #132    ; 0x84
 10014c8:       e3a00000        mov     r0, #0
 10014cc:       e1a01003        mov     r1, r3
 10014d0:       e59f202c        ldr     r2, [pc, #44]   ; 1001504
<_pei386_runtime_relocator+0x98>
 10014d4:       e3a03000        mov     r3, #0
 10014d8:       eb0000d6        bl      1001838 <MessageBoxW>
 10014dc:       e59f0024        ldr     r0, [pc, #36]   ; 1001508
<_pei386_runtime_relocator+0x9c>
 10014e0:       e59f1024        ldr     r1, [pc, #36]   ; 100150c
<_pei386_runtime_relocator+0xa0>
 10014e4:       e59f2024        ldr     r2, [pc, #36]   ; 1001510
<_pei386_runtime_relocator+0xa4>
 10014e8:       ebffff22        bl      1001178 <do_pseudo_reloc>
 10014ec:       ea000000        b       10014f4
<_pei386_runtime_relocator+0x88>
 10014f0:       e1a00000        nop                     ; (mov r0, r0)
 10014f4:       e24bd004        sub     sp, fp, #4
 10014f8:       e8bd8800        pop     {fp, pc}
 10014fc:       0101200c        tsteq   r1, ip
 1001500:       01013034        tsteq   r1, r4, lsr r0
 1001504:       01013000        tsteq   r1, r0
 1001508:       010130b4        strheq  r3, [r1, -r4]
 100150c:       010130b4        strheq  r3, [r1, -r4]
 1001510:       01000000        tsteq   r0, r0


PE File Base Relocations (interpreted .reloc section contents)

Virtual Address: 00001000 Chunk size 68 (0x44) Number of fixups 30
        reloc    0 offset  4fc [14fc] HIGHLOW
        reloc    1 offset  500 [1500] HIGHLOW
        reloc    2 offset  504 [1504] HIGHLOW
        reloc    3 offset  508 [1508] HIGHLOW
        reloc    4 offset  50c [150c] HIGHLOW
        reloc    5 offset  510 [1510] HIGHLOW
        reloc    6 offset  550 [1550] HIGHLOW
        reloc    7 offset  594 [1594] HIGHLOW
        reloc    8 offset  648 [1648] HIGHLOW
        reloc    9 offset  64c [164c] HIGHLOW
        reloc   10 offset  670 [1670] HIGHLOW
        reloc   11 offset  674 [1674] HIGHLOW
        reloc   12 offset  6dc [16dc] HIGHLOW
        reloc   13 offset  6e0 [16e0] HIGHLOW
        reloc   14 offset  744 [1744] HIGHLOW
        reloc   15 offset  748 [1748] HIGHLOW
        reloc   16 offset  788 [1788] HIGHLOW
        reloc   17 offset  7ec [17ec] HIGHLOW
        reloc   18 offset  7f0 [17f0] HIGHLOW
        reloc   19 offset  810 [1810] HIGHLOW
        reloc   20 offset  81c [181c] HIGHLOW
        reloc   21 offset  828 [1828] HIGHLOW
        reloc   22 offset  834 [1834] HIGHLOW
        reloc   23 offset  840 [1840] HIGHLOW
        reloc   24 offset  84c [184c] HIGHLOW
        reloc   25 offset  858 [1858] HIGHLOW
        reloc   26 offset  864 [1864] HIGHLOW
        reloc   27 offset  870 [1870] HIGHLOW
        reloc   28 offset  87c [187c] HIGHLOW
        reloc   29 offset  888 [1888] HIGHLOW

Virtual Address: 00012000 Chunk size 12 (0xc) Number of fixups 2
        reloc    0 offset    8 [12008] HIGHLOW
        reloc    1 offset    0 [12000] ABSOLUTE

Note : full objdump at
  http://danny.backx.info/download/cegcc/lib6.objdump

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


------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
_______________________________________________
Cegcc-devel mailing list
Cegcc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cegcc-devel

Reply via email to