LDSO Question
Sebastian Sumpf
Sebastian.Sumpf at ...1...
Thu Mar 17 15:50:28 CET 2011
Hi,
> <config>
> <parent-provides>
> <service name="ROM"/>
> <service name="RAM"/>
> <service name="IRQ"/>
> <service name="IO_MEM"/>
> <service name="IO_PORT"/>
> <service name="CAP"/>
> <service name="PD"/>
> <service name="RM"/>
> <service name="CPU"/>
> <service name="LOG"/>
> </parent-provides>
>
> <default-route>
> <any-service> <parent/> <any-child/> </any-service>
> </default-route>
> <start name="ps2_drv">
> <resource name="RAM" quantum="1M"/>
> <provides><service name="Input"/></provides>
> </start>
> <start name="pci_drv">
> <resource name="RAM" quantum="1M"/>
> <provides><service name="PCI"/></provides>
> </start>
> <start name="timer">
> <resource name="RAM" quantum="1M"/>
> <provides><service name="Timer"/></provides>
> </start>
> <start name="nitpicker">
> <resource name="RAM" quantum="1M"/>
> <provides><service name="Nitpicker"/></provides>
> </start>
> <start name="vesa_drv">
> <resource name="RAM" quantum="1M"/>
> <provides><service name="Framebuffer"/></provides>
> </start>
> <start name="launchpad">
> <resource name="RAM" quantum="32M"/>
> </start>
> <start name="ldso">
> <resource name="RAM" quantum="32M"/>
> </start>
> <start name="sharedlib">
> <resource name="RAM" quantum="10M"/>
> </start>
> <memsection name="ldso" file="ldso" direct="true" />
> </config>
As I mentioned before, *never* start ldso in your Genode config file.
All <start> tags are programs that will be launched by Genode, if during
this process a binary is encountered that is linked against shared
libraries, Genode will *automatically* invoke ldso in order to load the
program and the needed shared libs.
To give you a small example (please run make run/ldso from your Genode
build directory). This will build an application called 'test-ldso'.
If you run 'objdump -p test-ldso you will see:
bin/test-ldso: file format elf32-i386
Program Header:
PHDR off 0x00000034 vaddr 0x00001034 paddr 0x00000000 align 2**2
filesz 0x000000c0 memsz 0x000000c0 flags r--
INTERP off 0x000190b5 vaddr 0x003180b5 paddr 0x003180b5 align 2**0
filesz 0x00000007 memsz 0x00000007 flags r--
LOAD off 0x00001000 vaddr 0x00300000 paddr 0x00300000 align 2**12
filesz 0x0002499c memsz 0x0002499c flags r-x
LOAD off 0x00026000 vaddr 0x00325000 paddr 0x00325000 align 2**12
filesz 0x00008037 memsz 0x0001b070 flags rwx
DYNAMIC off 0x0002b4ec vaddr 0x0032a4ec paddr 0x0032a4ec align 2**12
filesz 0x00002b4b memsz 0x00015293 flags rwx
EH_FRAME off 0x00024cc8 vaddr 0x00323cc8 paddr 0x00323cc8 align 2**2
filesz 0x00000cd4 memsz 0x00000cd4 flags r--
Dynamic Section:
NEEDED /build/genode_rtld_elf/var/libcache/libc/libc.lib.so
NEEDED /build/genode_rtld_elf/var/libcache/libm/libm.lib.so
NEEDED
/build/genode_rtld_elf/var/libcache/test-ldso/test-ldso.lib.so
HASH 0x003180bc
STRTAB 0x0031bc00
SYMTAB 0x00319320
STRSZ 0x0000564f
SYMENT 0x00000010
DEBUG 0x00000000
PLTGOT 0x0032a59c
PLTRELSZ 0x00000018
PLTREL 0x00000011
JMPREL 0x00321510
REL 0x00321250
RELSZ 0x000002c0
RELENT 0x00000008
The 'NEEDED' shows you that test-ldso depends on libc.lib.so,
lbm.lib.so, and test-ldso.lib.so. In order to start the application in
Genode a config file would look like this:
<config>
<parent-provides>
<service name="ROM"/>
<service name="LOG"/>
</parent-provides>
<default-route>
<any-service> <parent/> </any-service>
</default-route>
<start name="test-ldso">
<resource name="RAM" quantum="1M"/>
</start>
</config>
You only need to start 'test-ldso', but the boot loader file would look
like this:
title Genode on L4ka::Pistachio
kernel /pistachio/kickstart
module /pistachio/x86-kernel
module /pistachio/sigma0
module /genode/core
module /genode/config
module /genode/init
module /genode/ldso
module /genode/test-ldso
module /genode/test-ldso.lib.so
module /genode/libc.lib.so
module /genode/libm.lib.so
Here you load the shared libaries and ldso so Genode can find them when
starting test-ldso. You can find the whole example under
<GENODE_BUILDDIR>/var/run/ldso.
So, assuming that 'sharedlib' is a program and *not* a library:
Remove this part from your config file:
<start name="ldso">
<resource name="RAM" quantum="32M"/>
</start>
If 'sharedlib' is a library remove this start tag a well and substitute it with the actual program using the library.
Remove:
<memsection name="ldso" file="ldso" direct="true" />
This looks like it was taken from an elfweaver config file which is OKL4 specific and has nothing to do with Genode configuration altogether.
Good luck,
-- Sebastian
More information about the users
mailing list