By specifying the config attribute 'check_ctors="no"', the dynamic linker won't abort the program on a missing call of 'Env::exec_static_constructors'. This is the case for forked programs where the ctors were already executed by the forking program prior the fork operation. Issue #3478
83 lines
2.7 KiB
Plaintext
83 lines
2.7 KiB
Plaintext
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"'.
|