Skip to content

Commit

Permalink
Cleanup shared-object support mechanics
Browse files Browse the repository at this point in the history
The former ldso-startup static library (now called ldso_so_support) is
used to spice each shared object/library with local support code for the
dynamic linker (execution of static constructors and ARM-EABI).
Therefore, the library must be statically linked to each dynamic
library.

As a result recipes for dynamic libraries must always depend on the "so"
API, which makes ldso_so_support.mk and so_support.c available
independent of "base". Additionally, ldso_so_support is also provided in
the libc API to cut the dependency early for libc/posix libraries.

Issue genodelabs#3720
  • Loading branch information
chelmuth authored and nfeske committed May 18, 2020
1 parent 589b416 commit 42fddf8
Show file tree
Hide file tree
Showing 14 changed files with 95 additions and 109 deletions.
3 changes: 0 additions & 3 deletions repos/base/lib/mk/ldso-startup.mk

This file was deleted.

3 changes: 3 additions & 0 deletions repos/base/lib/mk/ldso_so_support.mk
@@ -0,0 +1,3 @@
SRC_C = so_support.c

vpath so_support.c $(call select_from_repositories,src/lib/ldso)
5 changes: 0 additions & 5 deletions repos/base/lib/mk/spec/arm/ldso-startup.mk

This file was deleted.

2 changes: 1 addition & 1 deletion repos/base/mk/dep_lib.mk
Expand Up @@ -81,7 +81,7 @@ include $(BASE_DIR)/mk/base-libs.mk
include $(LIB_MK)

ifdef SHARED_LIB
LIBS += ldso-startup
LIBS += ldso_so_support
endif

#
Expand Down
9 changes: 3 additions & 6 deletions repos/base/mk/lib.mk
Expand Up @@ -181,10 +181,11 @@ $(LIB_A): $(OBJECTS)
$(VERBOSE)$(AR) -rcs $@ $(OBJECTS)

#
# Link ldso-startup library to each shared library
# Link ldso-support library to each shared library to provide local hook
# functions for constructors and ARM
#
ifdef SHARED_LIB
override ARCHIVES += ldso-startup.lib.a
override ARCHIVES += ldso_so_support.lib.a
endif

#
Expand All @@ -208,10 +209,6 @@ STATIC_LIBS_BRIEF := $(subst $(LIB_CACHE_DIR),$$libs,$(STATIC_LIBS))
# (LIB_SO_DEPS) to the library to store the library-dependency information in
# the generated shared object.
#
# The 'ldso-startup/startup.o' object file, which contains the support code for
# constructing static objects must be specified as object file to prevent the
# linker from garbage-collecting it.
#

#
# Default entry point of shared libraries
Expand Down
7 changes: 6 additions & 1 deletion repos/base/recipes/api/base/content.mk
Expand Up @@ -7,7 +7,7 @@ include:
mkdir -p include
cp -r $(REP_DIR)/include/* $@/

LIB_MK_FILES := base.mk ld.mk ldso-startup.mk
LIB_MK_FILES := base.mk ld.mk ldso_so_support.mk

lib:
mkdir -p lib/mk lib/symbols
Expand All @@ -21,6 +21,11 @@ mk/spec:
mkdir -p $@
cp $(foreach spec,$(SPECS),$(REP_DIR)/mk/spec/$(spec).mk) $@

content: lib/mk/ldso_so_support.mk src/lib/ldso/so_support.c

lib/mk/ldso_so_support.mk src/lib/ldso/so_support.c:
$(mirror_from_rep_dir)

LICENSE:
cp $(GENODE_DIR)/LICENSE $@

4 changes: 2 additions & 2 deletions repos/base/recipes/api/so/content.mk
@@ -1,6 +1,6 @@
content: lib/mk/ldso-startup.mk LICENSE
content: lib/mk/ldso_so_support.mk src/lib/ldso/so_support.c LICENSE

lib/mk/ldso-startup.mk:
lib/mk/ldso_so_support.mk src/lib/ldso/so_support.c:
$(mirror_from_rep_dir)

LICENSE:
Expand Down
71 changes: 71 additions & 0 deletions repos/base/src/lib/ldso/so_support.c
@@ -0,0 +1,71 @@
/**
* \brief Shared-object support code
* \author Sebastian Sumpf
* \author Christian Helmuth
* \date 2009-08-14
*
* Support code comprises hooks for execution of static constructors and
* ARM-EABI dynamic linking.
*
* The ARM cross compiler uses the __gnu_Unwind_Find_exidx hook to locate a
* 'ARM.exidx' section within a shared object. For this to work
* 'dl_unwind_find_exidx' is excuted by 'ldso', which returns the section
* address if it finds a shared object within the range of the provieded
* program counter.
*/

/*
* Copyright (C) 2009-2020 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/

#define BEG { (ld_hook) ~1U }
#define END { (ld_hook) 0 }
#define SECTION(x) __attribute__((used,section( x )))

typedef void (*ld_hook)(void);
static ld_hook _lctors_start[1] SECTION("_mark_ctors_start") = BEG;
static ld_hook _lctors_end[1] SECTION("_mark_ctors_end") = END;

/*
* '__dso_handle' needs to be defined in the main program and in each shared
* object. Because ld.lib.so is both of them, '__dso_handle' is weak here.
*/
void *__dso_handle __attribute__((__visibility__("hidden")))
__attribute__((weak)) = &__dso_handle;

/* called by dynamic linker on library startup (ld.lib.so) */
extern void _init(void) __attribute__((used,section(".init")));
extern void _init(void)
{
/* call static constructors */
for (ld_hook *func = _lctors_end; func > _lctors_start + 1; (*--func)());
}


/*
* from gcc/config/arm/unwind-arm.h
*/
typedef unsigned _Unwind_Ptr __attribute__((__mode__(__pointer__)));


/*
* Dummy for static libs, implemented in ldso for dynamic case
*/
extern _Unwind_Ptr dl_unwind_find_exidx(_Unwind_Ptr pc, int *pcount) __attribute__((weak));
extern _Unwind_Ptr dl_unwind_find_exidx(_Unwind_Ptr pc, int *pcount)
{
return 0;
}


/*
* Called from libgcc_eh.a file 'gcc/config/arm/unwind-arm.c' in function
* 'get_eit_entry'
*/
extern _Unwind_Ptr __gnu_Unwind_Find_exidx (_Unwind_Ptr pc, int *pcount)
{
return dl_unwind_find_exidx(pc, pcount);
}
38 changes: 0 additions & 38 deletions repos/base/src/lib/ldso/startup/startup.cc

This file was deleted.

48 changes: 0 additions & 48 deletions repos/base/src/lib/ldso/startup/unwind_exidx.cc

This file was deleted.

6 changes: 6 additions & 0 deletions repos/libports/recipes/api/libc/content.mk
Expand Up @@ -18,6 +18,12 @@ include:
cp -r $(REP_DIR)/include/libc-genode $@/
cp $(REP_DIR)/src/lib/libc/internal/legacy.h $@/libc/

content: lib/mk/ldso_so_support.mk src/lib/ldso/so_support.c

lib/mk/ldso_so_support.mk src/lib/ldso/so_support.c:
mkdir -p $(dir $@)
cp $(GENODE_DIR)/repos/base/$@ $@

content: LICENSE

LICENSE:
Expand Down
6 changes: 1 addition & 5 deletions repos/libports/recipes/api/posix/content.mk
@@ -1,14 +1,10 @@
MIRROR_FROM_REP_DIR := lib/symbols/posix lib/import/import-posix.mk

content: $(MIRROR_FROM_REP_DIR) LICENSE lib/mk/base.mk lib/mk/ldso-startup.mk
content: $(MIRROR_FROM_REP_DIR) LICENSE

$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)

lib/mk/base.mk lib/mk/ldso-startup.mk:
mkdir -p $(dir $@)
touch $@

LICENSE:
cp $(GENODE_DIR)/LICENSE $@

1 change: 1 addition & 0 deletions repos/libports/recipes/src/test-ldso/used_apis
@@ -1,2 +1,3 @@
base
libc
so
1 change: 1 addition & 0 deletions repos/os/recipes/src/vfs/used_apis
Expand Up @@ -6,3 +6,4 @@ report_session
rtc_session
terminal_session
vfs
so

0 comments on commit 42fddf8

Please sign in to comment.