genode/repos/base/src/lib/ldso
Ehmry - 3d68a520cb Tag release 19.11
-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEsIWqvdxEKaxX80hspyRgNBfs1rcFAl3fpmAACgkQpyRgNBfs
 1rcezQ//ZoYChufO6m2CByuPUbITql12b6oyOjmvcw16NW+Nsf2EodwMeCk/9yyM
 kWIxqOtXp1yFPGNf8ebEkTu5YXYMkHrUds4V6nQ4nQnyk7VnQmR3XTnqP8Sr27Hp
 fHi7Dddjxufexeyb6bwis04mK4PeFWXk/D6H4nh6ZeaR30g/GQ+Wt4N64a+HcQ1g
 kLMKuLlooOoq0L9q8IVLAtQoKNR1LP6x0FKGH8B6elwns8rXna2fRSlCB+W7qLwl
 K/pQadaIkwQNj8TEXuQxdGOR1GIrTbUz9ExS6U1yPXjqK06CunDZqsn+Cv5G7p+5
 ybMaViXwDGilZjhNLTjAbPhqhoOVu+yDB5gwzKiYt6/gTKP8N+VUpXKhGpzu/0ya
 wEt2b/43vmPm1NsBQQFU6vmjyW0W0iOl+a1tetv/qFo4mzQNesbVlu6t91b0EAjp
 C0JzZj9UHj/QkKgLIPkWMVWyz+VtODUeFhMLV6+86wzFmqSNhbaL0K/1LvX3AHZR
 5M/sjMRdtRL9U7Xv/LTn/Sgisk5wT2wfI9dpkAZALZjm22751mSTv9XhdLC/+XpA
 0F7cfSg36DphYsyPmSQ9+Q79rpU+bvuuTbqAsLdYcflMaW4bsIOd4j5Lk3adIPbN
 EE0uu+CD1GbqpKy+vLr+2EIlYpVNRTQKLklmkmhb+ZBuvUo00cU=
 =4dhl
 -----END PGP SIGNATURE-----

Merge tag '19.11'

Tag release 19.11
2019-11-28 13:21:13 +01:00
..
include Tag release 19.11 2019-11-28 13:21:13 +01:00
spec ldso: dynamic linking support for ARM 64-bit 2019-05-27 14:52:52 +02:00
README ldso: config option to disarm ctors check 2019-08-28 14:18:44 +02:00
debug.cc Remove pointers from Genode::Fifo interface 2019-02-19 11:08:17 +01:00
dependency.cc ldso: prevent premature execution of ctors 2019-09-20 14:16:05 +02:00
exception.cc Adjust file headers to refer to the AGPLv3 2017-02-28 12:59:29 +01:00
linker.ld Adjust file headers to refer to the AGPLv3 2017-02-28 12:59:29 +01:00
linux-32.ld Adjust file headers to refer to the AGPLv3 2017-02-28 12:59:29 +01:00
main.cc Tag release 19.11 2019-11-28 13:21:13 +01:00
shared_object.cc ldso/cxx: show symbols names of undefined references 2017-08-18 10:24:48 +02:00
test.cc Adjust file headers to refer to the AGPLv3 2017-02-28 12:59:29 +01:00

README

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"'.