genode/repos/base/src/lib/ldso
Norman Feske 17c79a9e23 base: avoid use of deprecated base/printf.h
Besides adapting the components to the use of base/log.h, the patch
cleans up a few base headers, i.e., it removes unused includes from
root/component.h, specifically base/heap.h and
ram_session/ram_session.h. Hence, components that relied on the implicit
inclusion of those headers have to manually include those headers now.

While adjusting the log messages, I repeatedly stumbled over the problem
that printing char * arguments is ambiguous. It is unclear whether to
print the argument as pointer or null-terminated string. To overcome
this problem, the patch introduces a new type 'Cstring' that allows the
caller to express that the argument should be handled as null-terminated
string. As a nice side effect, with this type in place, the optional len
argument of the 'String' class could be removed. Instead of supplying a
pair of (char const *, size_t), the constructor accepts a 'Cstring'.
This, in turn, clears the way let the 'String' constructor use the new
output mechanism to assemble a string from multiple arguments (and
thereby getting rid of snprintf within Genode in the near future).

To enforce the explicit resolution of the char * ambiguity, the 'char *'
overload of the 'print' function is marked as deleted.

Issue #1987
2016-08-29 17:27:10 +02:00
..
include base: avoid use of deprecated base/printf.h 2016-08-29 17:27:10 +02:00
spec base: avoid use of deprecated base/printf.h 2016-08-29 17:27:10 +02:00
startup base: avoid use of deprecated base/printf.h 2016-08-29 17:27:10 +02:00
debug.cc base: avoid use of deprecated base/printf.h 2016-08-29 17:27:10 +02:00
dependency.cc base: avoid use of deprecated base/printf.h 2016-08-29 17:27:10 +02:00
exception.cc base: avoid use of deprecated base/printf.h 2016-08-29 17:27:10 +02:00
file.cc base: avoid use of deprecated base/printf.h 2016-08-29 17:27:10 +02:00
linker.ld base: Genode's dynamic linker 2014-11-12 14:44:15 +01:00
linux-32.ld ldso: Make truly self relocatable 2015-12-10 13:16:25 +01:00
main.cc base: avoid use of deprecated base/printf.h 2016-08-29 17:27:10 +02:00
README base: Genode's dynamic linker 2014-11-12 14:44:15 +01:00
shared_object.cc base: avoid use of deprecated base/printf.h 2016-08-29 17:27:10 +02:00
symbol.map Supplement base/log.h with raw output function 2016-06-22 12:21:42 +02:00
test.cc base: Genode's dynamic linker 2014-11-12 14:44:15 +01:00

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. Currently there are to configurations options, 'ld_bind_now="yes"'
causes the linker to resolve all symbol references on program loading.
'ld_verbose="yes"' outputs library load informations 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>

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.