genode/repos/base/src/lib/ldso/startup/startup.cc

39 lines
1.1 KiB
C++

/**
* \brief Shared object startup code
* \author Sebastian Sumpf
* \date 2009-08-14
*/
/*
* Copyright (C) 2009-2013 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#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-genode.so) */
extern "C" {
void _init(void) __attribute__((used,section(".init")));
void _init(void)
{
/* call static constructors */
for(ld_hook *func = _lctors_end; func > _lctors_start + 1; (*--func)());
}
}