Loading shared objects in an l4env_freebsd application

Frank Mehnert fm3 at os.inf.tu-dresden.de
Fri Jun 10 14:16:29 CEST 2005


On Friday 10 June 2005 12:11, Derick Swanepoel wrote:
> On 6/10/05, Frank Mehnert <fm3 at os.inf.tu-dresden.de> wrote:
> > On Friday 10 June 2005 10:43, Derick Swanepoel wrote:
> > > Thanks for the advice. I have created a new mode to combine the loader
> > > mode with what I need from l4env_freebsd, and I can successfully
> > > compile and link my application. Unfortunately it causes a double
> > > pagefault when loaded...:
> > >
> > > loader  | "(nd)/fiasco/ds/test" is a valid binary image
> > > loader  | Setting libpath to (nd)/fiasco/ds/
> > > exec    | test: Loading
> > > exec    | test: Saved 457726 bytes of symbols
> > > exec    | libloader.s.so: Relocating to 0000e000
> > > exec    | libloader.s.so: Linking
> > > exec    | libloader.s.so: Relocating entry 000058d0 => 000138d0
> > > exec    | libloader.s.so: Setting section flag 0800
> > > exec    | test: Setting section flag 0800
> > > loader  | test: Starting l4env-style application
> > > loader  | test,#11: Starting at l4loader_init (00014080)
> > > loader  | test,#11: Double PF (r) at 00000000 eip 00000000 (11.00)
> >
> > Ok, this is a pagefault in the loader library. Please look at the file
> > l4/pkg/loader/server/src/app.c and search for APP_ADDR_LIBLOADER. Take
> > that address as the base for libloader.s.so. Subtract that address from
> > the pagefault address. The result is the offset into the loader lib. Do
> >
> >   objdump -ld libloader.s.so | less
> >
> > and search for the offset. Then scroll a little bit around and look
> > for lines of source code contained in the listing. Or simply post the
> > listing here.
>
> The value of APP_LIBLOADER in my libloader.s.so is 0x0000E000. The
> pagefault address is 0x00014057, which makes the offset 0x6057. Here
> is the function containing that offset (and l4loader_init(), which
> calls it):
>
> 00006020 <__do_l4loader_init>:
> __do_l4loader_init():
> /home/ljbrits/DROPS/l4/pkg/loader/lib/runtime/main.c:405
>     6020:       55                      push   %ebp
>     6021:       89 e5                   mov    %esp,%ebp
>     6023:       56                      push   %esi
>     6024:       53                      push   %ebx
>     6025:       e8 00 00 00 00          call   602a
> <__do_l4loader_init+0xa> 602a:       5b                      pop    %ebx
>     602b:       81 c3 8a b7 01 00       add    $0x1b78a,%ebx
> /home/ljbrits/DROPS/l4/pkg/loader/lib/runtime/main.c:408
>     6031:       8b b3 80 03 00 00       mov    0x380(%ebx),%esi
>     6037:       8b 45 08                mov    0x8(%ebp),%eax
>     603a:       89 06                   mov    %eax,(%esi)
> /home/ljbrits/DROPS/l4/pkg/loader/lib/runtime/main.c:410
>     603c:       e8 6f f9 ff ff          call   59b0 <__setup_fixed>
> /home/ljbrits/DROPS/l4/pkg/loader/lib/runtime/main.c:413
>     6041:       8b 83 50 08 00 00       mov    0x850(%ebx),%eax
>     6047:       52                      push   %edx
>     6048:       50                      push   %eax
>     6049:       8d 83 6c 08 00 00       lea    0x86c(%ebx),%eax
>     604f:       50                      push   %eax
>     6050:       6a 01                   push   $0x1
>     6052:       e8 69 f3 ff ff          call   53c0
> <l4env_get_infopage-0x510>
> /home/ljbrits/DROPS/l4/pkg/loader/lib/runtime/main.c:418
>     6057:       e8 b4 fa ff ff          call   5b10 <__attach_fixed>
> /home/ljbrits/DROPS/l4/pkg/loader/lib/runtime/main.c:419
>     605c:       58                      pop    %eax
>     605d:       8b 06                   mov    (%esi),%eax
>     605f:       50                      push   %eax
>     6060:       e8 7b f7 ff ff          call   57e0
> <l4env_get_infopage-0xf0>
> /home/ljbrits/DROPS/l4/pkg/loader/lib/runtime/main.c:420
>     6065:       e8 26 fe ff ff          call   5e90 <__fixup_modules>
> /home/ljbrits/DROPS/l4/pkg/loader/lib/runtime/main.c:423
>     606a:       e8 31 ff ff ff          call   5fa0 <__complete_load>
> /home/ljbrits/DROPS/l4/pkg/loader/lib/runtime/main.c:427
>     606f:       50                      push   %eax
>     6070:       c3                      ret
> /home/ljbrits/DROPS/l4/pkg/loader/lib/runtime/main.c:435
>     6071:       8d 65 f8                lea    0xfffffff8(%ebp),%esp
>     6074:       5b                      pop    %ebx
>     6075:       5e                      pop    %esi
>     6076:       5d                      pop    %ebp
>     6077:       c3                      ret
>     6078:       90                      nop
>     6079:       8d b4 26 00 00 00 00    lea    0x0(%esi,1),%esi
>
> 00006080 <l4loader_init>:
> l4loader_init():
> /home/ljbrits/DROPS/l4/pkg/loader/lib/runtime/main.c:440
>     6080:       55                      push   %ebp
>     6081:       89 e5                   mov    %esp,%ebp
> /home/ljbrits/DROPS/l4/pkg/loader/lib/runtime/main.c:441
>     6083:       5d                      pop    %ebp
>     6084:       eb 9a                   jmp    6020 <__do_l4loader_init>
>     6086:       8d 76 00                lea    0x0(%esi),%esi
>     6089:       8d bc 27 00 00 00 00    lea    0x0(%edi,1),%edi
>

The function __attach_fixed() seems to raise the 0-pagefault. I would
suggest you to add some printf-statements into the loader/lib/runtime/main.c
file. Try first if you can add

  printf("HERE\n");

at the beginning of the main l4loader_init() function. If that works,
instrument __attach_fixed() to find out at which line the 0-PF is
generated.

Frank
-- 
## Dept. of Computer Science, Dresden University of Technology, Germany ##
## http://os.inf.tu-dresden.de/~fm3                                     ##
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://os.inf.tu-dresden.de/pipermail/l4-hackers/attachments/20050610/048f0824/attachment.sig>


More information about the l4-hackers mailing list