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-0001.sig>
More information about the l4-hackers
mailing list