22d4d5c1c1
move binary to front of link map after respawn. This is required by GDB in order to load symbol files correctly. issue #3481 |
||
---|---|---|
.. | ||
include | ||
spec | ||
startup | ||
debug.cc | ||
dependency.cc | ||
exception.cc | ||
linker.ld | ||
linux-32.ld | ||
main.cc | ||
README | ||
shared_object.cc | ||
test.cc |
This directory contains Genode's dynamic linker (ldso) Usage ----- To build a shared library instead of a regular static library, you just need to declare 'SHARED_LIB = yes' in the library-description file. When doing so, a '<libname>.lib.so' file will be generated and installed in the '<build-dir>/bin/' directory. For building an executable that uses a shared library, no special precautions are needed. The build system will automatically detect the use of shared libraries, concludes that the binary must be dynamically linked, and will use the correct linker script. When loading a dynamically linked program, the dynamic linker 'ldso.lib.so' and all used shared objects must be loaded as well. The linker can be configured through the '<config>' node when loading a dynamic binary. The configuration option 'ld_bind_now="yes"' prompts the linker to resolve all symbol references on program loading. 'ld_verbose="yes"' outputs library load information before starting the program. Configuration snippet: !<!-- bind immediately, no library informations --> !<start name="dynamic_binary"> ! <resource name="RAM" quantum="1M" /> ! <config ld_bind_now="yes" ld_verbose="no"> ! </config> !</start> Preloading libraries -------------------- The dynamic linker supports the preloading of libraries according to its configuration. The list of libraries must be specified within an '<ld>' sub node of the configuration: ! <config> ! ... ! <ld> ! <library rom="libc_customization.lib.so"/> ! </ld> ! ... ! </config> Debugging dynamic binaries with GDB stubs ----------------------------------------- ! # go to directory containing the binaries ! cd <build/dir>/bin ! ! # start GDB with binary to debug ! gdb <binary name> ! ! # break in main routine ! b main ! ! # inspect loaded shared libraries ! info sharedlibrary ! ! # load shared symbols of shared libraries (if not already loaded) ! share ! ! # from here you can debug within libraries :Known issues: GDB 7.2 has a regression bug in its line information parser. These issue has been fixed with version 7.3. Execution of global static constructors --------------------------------------- The dynamic linker does not implicitely execute global static constructors (ctors) at the loading time of a program but leaves this up to the loaded program, which can trigger the execution of the ctors by calling 'Env::exec_static_constructors()'. This gives the program the power over the point in time for such initializations. However, once a component's initialization is complete (when 'Component::construct') returned, the linker checks that static constructors - if present - were executed and aborts otherwise. This check can be explicitely disabled by specifying the config attribute 'ld_check_ctors="no"'.