39 lines
1.1 KiB
C++
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)());
|
|
}
|
|
}
|