Simpify startup of dynamically linked binaries

This patch removes the component_entry_point library, which used to
proved a hook for the libc to intercept the call of the
'Component::construct' function. The mechansim has several shortcomings
(see the discussion in the associated issue) and was complex. So we
eventually discarded the approach in favor of the explicit handling of
the startup.

A regular Genode component provides a 'Component::construct' function,
which is determined by the dynamic linker via a symbol lookup.
For the time being, the dynamic linker falls back to looking up a 'main'
function if no 'Component::construct' function could be found.

The libc provides an implementation of 'Component::construct', which
sets up the libc's task handling and finally call the function
'Libc::Component::construct' from the context of the appllication task.
This function is expected to be provided by the libc-using application.
Consequently, Genode components that use the libc have to implement the
'Libc::Component::construct' function.

The new 'posix' library provides an implementation of
'Libc::Component::construct' that calls a main function. Hence, POSIX
programs that merely use the POSIX API merely have to add 'posix' to the
'LIBS' declaration in their 'target.mk' file. Their execution starts at
'main'.

Issue #2199
This commit is contained in:
Norman Feske 2016-12-22 15:01:19 +01:00
parent 8d521036fb
commit 4da52517c1
112 changed files with 366 additions and 369 deletions

View File

@ -43,7 +43,6 @@ SRC_CC += env.cc
SRC_CC += region_map_support.cc SRC_CC += region_map_support.cc
SRC_CC += pager.cc SRC_CC += pager.cc
SRC_CC += _main.cc SRC_CC += _main.cc
SRC_CC += component_construct.cc
SRC_CC += kernel/cpu_scheduler.cc SRC_CC += kernel/cpu_scheduler.cc
SRC_CC += kernel/double_list.cc SRC_CC += kernel/double_list.cc
SRC_CC += kernel/init.cc SRC_CC += kernel/init.cc

View File

@ -78,16 +78,6 @@ namespace Genode {
extern void bootstrap_component(); extern void bootstrap_component();
extern void call_global_static_constructors(); extern void call_global_static_constructors();
/*
* Hook for intercepting the call of the 'Component::construct' method. By
* hooking this function pointer in a library constructor, the libc is able
* to create a task context for the component code. This context is
* scheduled by the libc in a cooperative fashion, i.e. when the
* component's entrypoint is activated.
*/
extern void (*call_component_construct)(Genode::Env &) __attribute__((weak));
/* /*
* This function is normally provided by the cxx library, which is not * This function is normally provided by the cxx library, which is not
* used for lx_hybrid programs. For lx_hybrid programs, the exception * used for lx_hybrid programs. For lx_hybrid programs, the exception
@ -96,13 +86,6 @@ namespace Genode {
void init_exception_handling(Env &) { } void init_exception_handling(Env &) { }
} }
static void lx_hybrid_component_construct(Genode::Env &env)
{
Component::construct(env);
}
void (*Genode::call_component_construct)(Genode::Env &) = &lx_hybrid_component_construct;
/* /*
* Static constructors are handled by the Linux startup code - so implement * Static constructors are handled by the Linux startup code - so implement
* this as empty function. * this as empty function.

View File

@ -1,6 +0,0 @@
#
# All dynamic executables must be linked to the component entry-point library
# (a trampoline for component startup from ldso), so, enforce the library
# dependency here.
#
LIBS += component_entry_point

View File

@ -1 +0,0 @@
include $(BASE_DIR)/lib/import/import-base.mk

View File

@ -1,7 +0,0 @@
#
# Component entry point (a trampoline for component startup from ldso)
#
SRC_CC = component_entry_point.cc component_construct.cc
vpath %.cc $(REP_DIR)/src/lib/startup

View File

@ -38,8 +38,6 @@ ENTRY_POINT = _start
LD_OPT += -T$(DIR)/linker.ld LD_OPT += -T$(DIR)/linker.ld
endif endif
include $(BASE_DIR)/lib/import/import-ld.mk
vpath %.cc $(DIR) vpath %.cc $(DIR)
# vi:ft=make # vi:ft=make

View File

@ -1 +0,0 @@
LIBS = component_entry_point

View File

@ -1,5 +1,5 @@
SRC_S += crt0.s SRC_S += crt0.s
SRC_CC += _main.cc init_main_thread.cc component_construct.cc SRC_CC += _main.cc init_main_thread.cc
REP_INC_DIR += src/include REP_INC_DIR += src/include
LIBS += syscall LIBS += syscall

View File

@ -184,7 +184,6 @@ _ZN6Genode18Signal_transmitterC1ENS_10CapabilityINS_14Signal_contextEEE T
_ZN6Genode18Signal_transmitterC2ENS_10CapabilityINS_14Signal_contextEEE T _ZN6Genode18Signal_transmitterC2ENS_10CapabilityINS_14Signal_contextEEE T
_ZN6Genode18server_socket_pairEv T _ZN6Genode18server_socket_pairEv T
_ZN6Genode20env_session_id_spaceEv T _ZN6Genode20env_session_id_spaceEv T
_ZN6Genode21component_entry_pointERNS_3EnvE T
_ZN6Genode25env_stack_area_region_mapE B _ZN6Genode25env_stack_area_region_mapE B
_ZN6Genode26env_stack_area_ram_sessionE B _ZN6Genode26env_stack_area_ram_sessionE B
_ZN6Genode29upgrade_pd_quota_non_blockingEm T _ZN6Genode29upgrade_pd_quota_non_blockingEm T

View File

@ -106,11 +106,9 @@ endif
# #
ifeq ($(LIBS),) ifeq ($(LIBS),)
ifneq ($(LIB),platform) ifneq ($(LIB),platform)
ifneq ($(LIB),component_entry_point)
LIBS += platform LIBS += platform
endif endif
endif endif
endif
# #
# Check if the requirements of the target are satisfied # Check if the requirements of the target are satisfied

View File

@ -159,7 +159,7 @@ $(LIB_RLIB): $(OBJECTS)
# #
ifdef SHARED_LIB ifdef SHARED_LIB
ifneq ($(LIB_IS_DYNAMIC_LINKER),yes) ifneq ($(LIB_IS_DYNAMIC_LINKER),yes)
override DEPS := $(filter-out $(BASE_LIBS:=.lib) component_entry_point.lib,$(DEPS)) override DEPS := $(filter-out $(BASE_LIBS:=.lib),$(DEPS))
endif endif
endif endif

View File

@ -110,14 +110,8 @@ LD_CMD ?= $(CXX)
LD_CMD += $(CXX_LINK_OPT) LD_CMD += $(CXX_LINK_OPT)
ifeq ($(SHARED_LIBS),) ifeq ($(SHARED_LIBS),)
FILTER_DEPS := $(DEPS:.lib=)
LD_SCRIPTS := $(LD_SCRIPT_STATIC) LD_SCRIPTS := $(LD_SCRIPT_STATIC)
#
# Filter out the component-entry-point library since its not used for static
# binaries
#
FILTER_DEPS := $(filter-out component_entry_point,$(DEPS:.lib=))
else else
# #
@ -135,13 +129,6 @@ LD_CMD += -Wl,--dynamic-linker=$(DYNAMIC_LINKER).lib.so \
FILTER_DEPS := $(filter-out $(BASE_LIBS),$(DEPS:.lib=)) FILTER_DEPS := $(filter-out $(BASE_LIBS),$(DEPS:.lib=))
SHARED_LIBS += $(LIB_CACHE_DIR)/$(DYNAMIC_LINKER)/$(DYNAMIC_LINKER).lib.so SHARED_LIBS += $(LIB_CACHE_DIR)/$(DYNAMIC_LINKER)/$(DYNAMIC_LINKER).lib.so
#
# Link all dynamic executables to the component entry-point library (a
# trampoline for component startup from ldso)
#
FILTER_DEPS += component_entry_point
# #
# Build program position independent as well # Build program position independent as well
# #

View File

@ -13,4 +13,7 @@
_ctors_end; _ctors_end;
_dtors_start; _dtors_start;
_dtors_end; _dtors_end;
_ZN9Component9constructERN6Genode3EnvE;
_ZN9Component10stack_sizeEv;
main;
}; };

View File

@ -11,14 +11,10 @@
* under the terms of the GNU General Public License version 2. * under the terms of the GNU General Public License version 2.
*/ */
/* /*
* Components don't need to startup with CRT0 as LDSO has done this * The entry point of dynamically linked components is unused. The dynamic
* initialization during its own CRT0 already. The component always starts at * linker determines the 'Component::construct' function via a symbol lookup.
* Genode::component_entry_point() as a trampoline to
* call_component_construct().
*/ */
ENTRY(_ZN6Genode21component_entry_pointERNS_3EnvE)
PHDRS PHDRS
{ {
@ -37,10 +33,21 @@ SECTIONS
{ {
_prog_img_beg = .; _prog_img_beg = .;
/* put entry code at the start of the text segment / raw binary */ /*
*(.text._ZN6Genode21component_entry_pointERNS_3EnvE) * The ELF entry point is unused for dynamically linked components. The
* dynamic linker determined the entry point by looking up the symbol of
* the 'Component::construct' function or - if it does not exist - the
* 'main' function (for legacy components).
*
* \deprecated The support for legacy main functions will be removed.
*
* The 'KEEP' directive prevents text that is reachable from one of the
* possible entry points from being garbage collected.
*/
KEEP(*(.text._ZN9Component9constructERN6Genode3EnvE .text.main))
*(.text .stub .text.* .gnu.linkonce.t.*) *(.text
.stub .text.* .gnu.linkonce.t.*)
/* .gnu.warning sections are handled specially by elf32.em. */ /* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning) *(.gnu.warning)
} : ro =0x0 } : ro =0x0

View File

@ -152,6 +152,10 @@ namespace Genode {
} }
Genode::size_t Component::stack_size() __attribute__((weak));
Genode::size_t Component::stack_size() { return 64*1024; }
/* /*
* We need to execute the constructor of the main entrypoint from a * We need to execute the constructor of the main entrypoint from a
* class called 'Startup' as 'Startup' is a friend of 'Entrypoint'. * class called 'Startup' as 'Startup' is a friend of 'Entrypoint'.

View File

@ -31,8 +31,6 @@ namespace Genode {
extern bool inhibit_tracing; extern bool inhibit_tracing;
void call_global_static_constructors(); void call_global_static_constructors();
void destroy_signal_thread(); void destroy_signal_thread();
extern void (*call_component_construct)(Genode::Env &);
} }
@ -152,7 +150,7 @@ namespace {
Genode::call_global_static_constructors(); Genode::call_global_static_constructors();
Genode::call_component_construct(env); Component::construct(env);
} }
}; };
} }

View File

@ -317,6 +317,20 @@ Linker::Ld &Linker::Ld::linker()
} }
/*
* Defined in the startup library, passed to legacy main functions.
*/
extern char **genode_argv;
extern int genode_argc;
extern char **genode_envp;
void genode_exit(int status);
static int exit_status;
static void exit_on_suspended() { genode_exit(exit_status); }
/** /**
* The dynamic binary to load * The dynamic binary to load
*/ */
@ -348,16 +362,26 @@ struct Linker::Binary : Root_object, Elf_object
Elf::Addr lookup_symbol(char const *name) Elf::Addr lookup_symbol(char const *name)
{ {
Elf::Sym const *symbol = 0; try {
Elf::Addr base = 0;
if ((symbol = Elf_object::lookup_symbol(name, Hash_table::hash(name)))) Elf::Sym const *sym = Linker::lookup_symbol(name, dynamic().dep(), &base);
return reloc_base() + symbol->st_value; return base + sym->st_value;
}
return 0; catch (Linker::Not_found) { return 0; }
} }
void call_entry_point(Env &env) void call_entry_point(Env &env)
{ {
/* apply the component-provided stack size */
if (Elf::Addr addr = lookup_symbol("_ZN9Component10stack_sizeEv")) {
/* call 'Component::stack_size()' */
size_t const stack_size = ((size_t(*)())addr)();
/* expand stack according to the component's needs */
Thread::myself()->stack_size(stack_size);
}
/* call static construtors and register destructors */ /* call static construtors and register destructors */
Func * const ctors_start = (Func *)lookup_symbol("_ctors_start"); Func * const ctors_start = (Func *)lookup_symbol("_ctors_start");
Func * const ctors_end = (Func *)lookup_symbol("_ctors_end"); Func * const ctors_end = (Func *)lookup_symbol("_ctors_end");
@ -367,13 +391,33 @@ struct Linker::Binary : Root_object, Elf_object
Func * const dtors_end = (Func *)lookup_symbol("_dtors_end"); Func * const dtors_end = (Func *)lookup_symbol("_dtors_end");
for (Func * dtor = dtors_start; dtor != dtors_end; genode_atexit(*dtor++)); for (Func * dtor = dtors_start; dtor != dtors_end; genode_atexit(*dtor++));
/* call component entry point */ /* call 'Component::construct' function if present */
/* XXX the function type for call_component_construct() is a candidate if (Elf::Addr addr = lookup_symbol("_ZN9Component9constructERN6Genode3EnvE")) {
* for a base-internal header */ ((void(*)(Env &))addr)(env);
typedef void (*Entry)(Env &); return;
Entry const entry = reinterpret_cast<Entry>(_file->entry); }
entry(env); /*
* The 'Component::construct' function is missing. This may be the
* case for legacy components that still implement a 'main' function.
*
* \deprecated the handling of legacy 'main' functions will be removed
*/
if (Elf::Addr addr = lookup_symbol("main")) {
warning("using legacy main function, please convert to 'Component::construct'");
exit_status = ((int (*)(int, char **, char **))addr)(genode_argc,
genode_argv,
genode_envp);
/* trigger suspend in the entry point */
env.ep().schedule_suspend(exit_on_suspended, nullptr);
/* return to entrypoint and exit via exit_on_suspended() */
return;
}
error("dynamic linker: component-entrypoint lookup failed");
} }
void relocate(Bind bind) override void relocate(Bind bind) override
@ -486,7 +530,6 @@ Elf::Sym const *Linker::lookup_symbol(char const *name, Dependency const &dep,
if (binary_ptr && &dep != binary_ptr->first_dep()) { if (binary_ptr && &dep != binary_ptr->first_dep()) {
return lookup_symbol(name, *binary_ptr->first_dep(), base, undef, other); return lookup_symbol(name, *binary_ptr->first_dep(), base, undef, other);
} else { } else {
error("LD: could not lookup symbol \"", name, "\"");
throw Not_found(); throw Not_found();
} }
} }

View File

@ -250,3 +250,24 @@ extern "C" int _main()
/* never reached */ /* never reached */
return 0; return 0;
} }
static int exit_status;
static void exit_on_suspended() { genode_exit(exit_status); }
extern int main(int argc, char **argv, char **envp);
void Component::construct(Genode::Env &env) __attribute__((weak));
void Component::construct(Genode::Env &env)
{
/* call real main function */
exit_status = main(genode_argc, genode_argv, genode_envp);
/* trigger suspend in the entry point */
env.ep().schedule_suspend(exit_on_suspended, nullptr);
/* return to entrypoint and exit via exit_on_suspended() */
}

View File

@ -1,88 +0,0 @@
/*
* \brief Startup code for component construction
* \author Christian Helmuth
* \date 2016-01-21
*
* The component construction code is used by the startup library, which is
* linked to static binaries and ld.lib.so. The code is also used by the
* component_entry_point static library, which is linked to all dynamic
* executables to make the fallback implementation and the
* call_component_construct-hook function pointer available to these binaries.
*
* Note, for dynamic binaries we can't refer to the default implementation in
* ld.lib.so as it is a component itself implementing the Component functions.
*/
/*
* Copyright (C) 2016 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.
*/
/* Genode includes */
#include <base/component.h>
namespace Genode {
/*
* Hook for intercepting the call of the 'Component::construct' method. By
* hooking this function pointer in a library constructor, the libc is able
* to create a task context for the component code. This context is
* scheduled by the libc in a cooperative fashion, i.e. when the
* component's entrypoint is activated.
*/
extern void (*call_component_construct)(Genode::Env &) __attribute__((weak));
}
static void default_component_construct(Genode::Env &env)
{
Component::construct(env);
}
void (*Genode::call_component_construct)(Genode::Env &) = &default_component_construct;
/****************************************************
** Fallback implementation of Component interface **
****************************************************/
extern void genode_exit(int status);
static int exit_status;
static void exit_on_suspended() { genode_exit(exit_status); }
/*
* Regular components provide the 'Component' interface as defined in
* base/component.h. This fallback accommodates legacy components that lack the
* implementation of this interface but come with a main function.
*/
/*
* XXX these symbols reside in the startup library - candidate for
* base-internal header?
*/
extern char **genode_argv;
extern int genode_argc;
extern char **genode_envp;
extern int main(int argc, char **argv, char **envp);
void Component::construct(Genode::Env &env) __attribute__((weak));
void Component::construct(Genode::Env &env)
{
/* call real main function */
exit_status = main(genode_argc, genode_argv, genode_envp);
/* trigger suspend in the entry point */
env.ep().schedule_suspend(exit_on_suspended, nullptr);
/* return to entrypoint and exit via exit_on_suspended() */
}
Genode::size_t Component::stack_size() __attribute__((weak));
Genode::size_t Component::stack_size() { return 64*1024; }

View File

@ -1,32 +0,0 @@
/*
* \brief Component entry point for dynamic executables
* \author Christian Helmuth
* \date 2016-01-21
*
* The ELF entry point of dynamic binaries is set to component_entry_point(),
* which calls the call_component_construct-hook function pointer.
*/
/*
* Copyright (C) 2016 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.
*/
/* Genode includes */
#include <base/component.h>
/* FIXME move to base-internal header */
namespace Genode {
extern void (*call_component_construct)(Env &);
}
namespace Genode {
void component_entry_point(Genode::Env &env)
{
call_component_construct(env);
}
}

View File

@ -12,7 +12,7 @@
*/ */
/* Genode includes */ /* Genode includes */
#include <base/component.h> #include <libc/component.h>
#include <base/heap.h> #include <base/heap.h>
#include <base/log.h> #include <base/log.h>
#include <base/sleep.h> #include <base/sleep.h>
@ -254,4 +254,4 @@ struct Main
}; };
void Component::construct(Genode::Env &env) { static Main server(env); } void Libc::Component::construct(Genode::Env &env) { static Main server(env); }

View File

@ -1,3 +1,3 @@
TARGET = test-lxip_http_srv TARGET = test-lxip_http_srv
LIBS = libc libc_lxip LIBS = posix libc_lxip
SRC_CC = main.cc SRC_CC = main.cc

View File

@ -1,3 +1,3 @@
TARGET = test-lxip_udp_client TARGET = test-lxip_udp_client
LIBS = libc libc_lxip config LIBS = posix libc_lxip config
SRC_CC = main.cc SRC_CC = main.cc

View File

@ -1,3 +1,3 @@
TARGET = test-lxip_udp_echo TARGET = test-lxip_udp_echo
LIBS = libc libc_lxip config LIBS = posix libc_lxip config
SRC_CC = main.cc SRC_CC = main.cc

View File

@ -1,3 +1,3 @@
TARGET = backdrop TARGET = backdrop
SRC_CC = main.cc SRC_CC = main.cc
LIBS = base config libc libpng zlib blit file LIBS = base config posix libpng zlib blit file

View File

@ -1,6 +1,6 @@
TARGET = menu_view TARGET = menu_view
SRC_CC = main.cc SRC_CC = main.cc
LIBS = base config libc libpng zlib blit file LIBS = base config posix libpng zlib blit file
INC_DIR += $(PRG_DIR) INC_DIR += $(PRG_DIR)
.PHONY: menu_view_styles.tar .PHONY: menu_view_styles.tar

View File

@ -8,4 +8,4 @@ include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc
main_window.o: main_window.moc main_window.o: main_window.moc
LIBS += config qoost LIBS += config qoost posix

View File

@ -13,7 +13,7 @@
/* Genode includes */ /* Genode includes */
#include <base/log.h> #include <base/log.h>
#include <base/component.h> #include <libc/component.h>
#include <base/heap.h> #include <base/heap.h>
#include <base/attached_rom_dataspace.h> #include <base/attached_rom_dataspace.h>
#include <os/reporter.h> #include <os/reporter.h>
@ -317,4 +317,4 @@ void Decorator::Main::_handle_pointer_update()
} }
void Component::construct(Genode::Env &env) { static Decorator::Main main(env); } void Libc::Component::construct(Genode::Env &env) { static Decorator::Main main(env); }

View File

@ -1,3 +1,3 @@
TARGET = file_terminal TARGET = file_terminal
SRC_CC = main.cc SRC_CC = main.cc
LIBS = libc LIBS = posix

View File

@ -16,6 +16,7 @@
#include <base/attached_rom_dataspace.h> #include <base/attached_rom_dataspace.h>
#include <base/log.h> #include <base/log.h>
#include <block/component.h> #include <block/component.h>
#include <libc/component.h>
/* local includes */ /* local includes */
#include "http.h" #include "http.h"
@ -106,4 +107,4 @@ struct Main
}; };
void Component::construct(Genode::Env &env) { static Main m(env); } void Libc::Component::construct(Genode::Env &env) { static Main m(env); }

View File

@ -1,3 +1,3 @@
TARGET = tcp_terminal TARGET = tcp_terminal
SRC_CC = main.cc SRC_CC = main.cc
LIBS = libc libc_lwip_nic_dhcp libc_pipe LIBS = posix libc_lwip_nic_dhcp libc_pipe

View File

@ -13,7 +13,7 @@
/* Genode includes */ /* Genode includes */
#include <base/env.h> #include <base/env.h>
#include <base/component.h> #include <libc/component.h>
#include <base/heap.h> #include <base/heap.h>
#include <base/session_label.h> #include <base/session_label.h>
#include <util/arg_string.h> #include <util/arg_string.h>
@ -721,4 +721,4 @@ struct Main
}; };
void Component::construct(Genode::Env &env) { static Main inst(env); } void Libc::Component::construct(Genode::Env &env) { static Main inst(env); }

View File

@ -1,6 +1,6 @@
TARGET = test-decorator_stress TARGET = test-decorator_stress
SRC_CC = main.cc SRC_CC = main.cc
LIBS = libc libm LIBS = posix
INC_DIR += $(PRG_DIR) INC_DIR += $(PRG_DIR)

View File

@ -0,0 +1,48 @@
/*
* \brief Hook functions for bootstrapping a libc-using Genode component
* \author Norman Feske
* \date 2016-12-23
*
* This interface is implemented by components that use both Genode's API and
* the libc. For such components, the libc provides the 'Component::construct'
* function that takes the precautions needed for letting the application use
* blocking I/O via POSIX functions like 'read' or 'select'. The libc's
* 'Component::construct' function finally passes control to the application by
* calling the application-provided 'Libc::Component::construct' function.
*/
/*
* Copyright (C) 2016 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.
*/
#ifndef _INCLUDE__LIBC__COMPONENT_H_
#define _INCLUDE__LIBC__COMPONENT_H_
#include <base/env.h>
#include <base/stdint.h>
namespace Genode { struct Env; }
/**
* Interface to be provided by the component implementation
*/
namespace Libc { namespace Component {
/**
* Return stack size of the component's initial entrypoint
*/
Genode::size_t stack_size();
/**
* Construct component
*
* \param env interface to the component's execution environment
*/
void construct(Genode::Env &env);
} }
#endif /* _INCLUDE__LIBC__COMPONENT_H_ */

View File

@ -0,0 +1,3 @@
LIBS += libc libm
include $(call select_from_repositories,lib/import/import-libc.mk)

View File

@ -105,7 +105,6 @@ include $(call select_from_repositories,lib/import/import-gallium.mk)
# custom main() thread stack size support via main() wrapper # custom main() thread stack size support via main() wrapper
ifeq ($(findstring -DQT_MAIN_STACK_SIZE, $(CC_CXX_OPT)), -DQT_MAIN_STACK_SIZE) ifeq ($(findstring -DQT_MAIN_STACK_SIZE, $(CC_CXX_OPT)), -DQT_MAIN_STACK_SIZE)
CC_CXX_OPT += -Dmain=qt_main
SRC_CC += qt_main.cc SRC_CC += qt_main.cc
vpath qt_main.cc $(QT5_REP_DIR)/src/lib/qt5 vpath qt_main.cc $(QT5_REP_DIR)/src/lib/qt5
endif endif

View File

@ -0,0 +1,5 @@
SRC_CC = construct.cc
LIBS += libc
vpath construct.cc $(REP_DIR)/src/lib/posix

View File

@ -100,7 +100,7 @@ install_config $config
# generic modules # generic modules
set boot_modules { set boot_modules {
core init timer core init timer
ld.lib.so libc.lib.so ld.lib.so libc.lib.so libm.lib.so
test-libc_block test-libc_block
} }

View File

@ -104,7 +104,7 @@ install_config $config
# generic modules # generic modules
set boot_modules { set boot_modules {
core init timer ffat_fs core init timer ffat_fs
ld.lib.so libc.lib.so ld.lib.so libc.lib.so libm.lib.so
test-libc_vfs test-libc_vfs
} }

View File

@ -130,7 +130,7 @@ install_config $config
# generic modules # generic modules
set boot_modules { set boot_modules {
core init timer core init timer
ld.lib.so libc.lib.so ld.lib.so libc.lib.so libm.lib.so
} }
append boot_modules test-libc_$filesystem append boot_modules test-libc_$filesystem

View File

@ -32,7 +32,7 @@ install_config {
build_boot_image { build_boot_image {
core init test-libc_pipe core init test-libc_pipe
ld.lib.so libc.lib.so libc_pipe.lib.so pthread.lib.so ld.lib.so libc.lib.so libm.lib.so libc_pipe.lib.so pthread.lib.so
} }
append qemu_args " -nographic -m 64 " append qemu_args " -nographic -m 64 "

View File

@ -62,7 +62,7 @@ install_config $config
build_boot_image { build_boot_image {
core init core init
ld.lib.so libc.lib.so ld.lib.so libc.lib.so libm.lib.so
ram_fs test-libc_vfs ram_fs test-libc_vfs
} }

View File

@ -65,7 +65,7 @@ install_config $config
build_boot_image { build_boot_image {
core init vfs core init vfs
ld.lib.so libc.lib.so ld.lib.so libc.lib.so libm.lib.so
test-libc_vfs test-libc_vfs
} }

View File

@ -60,7 +60,7 @@ install_config $config
build_boot_image { build_boot_image {
core init core init
ld.lib.so libc.lib.so ld.lib.so libc.lib.so libm.lib.so
test-libc_vfs test-libc_vfs
} }

View File

@ -120,7 +120,7 @@ install_config $config
# generic modules # generic modules
set boot_modules { set boot_modules {
core init timer core init timer
ld.lib.so libc.lib.so lwip.lib.so test-lwip_httpsrv ld.lib.so libc.lib.so libm.lib.so lwip.lib.so test-lwip_httpsrv
} }
# platform-specific modules # platform-specific modules

View File

@ -369,7 +369,7 @@ install_config $config
# generic modules # generic modules
set boot_modules { set boot_modules {
core init timer nic_router nic_bridge ld.lib.so libc.lib.so core init timer nic_router nic_bridge ld.lib.so libc.lib.so libm.lib.so
libc_resolv.lib.so lwip.lib.so lxip.lib.so test-http_clnt libc_resolv.lib.so lwip.lib.so lxip.lib.so test-http_clnt
test-lwip_httpsrv_static test-lxip_udp_echo test-lxip_udp_client test-lwip_httpsrv_static test-lxip_udp_echo test-lxip_udp_client
} }

View File

@ -32,7 +32,7 @@ install_config {
build_boot_image { build_boot_image {
core init test-pthread core init test-pthread
ld.lib.so libc.lib.so pthread.lib.so ld.lib.so libc.lib.so libm.lib.so pthread.lib.so
} }
append qemu_args " -nographic -m 128 " append qemu_args " -nographic -m 128 "

View File

@ -109,7 +109,7 @@ install_config $config
set boot_modules { set boot_modules {
core init timer usb_drv test-smartcard core init timer usb_drv test-smartcard
ld.lib.so pcsc-lite.lib.so ccid.lib.so libusb.lib.so ld.lib.so pcsc-lite.lib.so ccid.lib.so libusb.lib.so
libc.lib.so libc_pipe.lib.so pthread.lib.so libc.lib.so libm.lib.so libc_pipe.lib.so pthread.lib.so
Info.plist Info.plist
} }

View File

@ -11,7 +11,7 @@
*/ */
#include <base/allocator_avl.h> #include <base/allocator_avl.h>
#include <base/component.h> #include <libc/component.h>
#include <base/log.h> #include <base/log.h>
#include <base/signal.h> #include <base/signal.h>
#include <base/heap.h> #include <base/heap.h>
@ -303,4 +303,4 @@ ACPI_STATUS AcpiOsInstallInterruptHandler(UINT32 irq, ACPI_OSD_HANDLER handler,
} }
void Component::construct(Genode::Env &env) { static Acpica::Main main(env); } void Libc::Component::construct(Genode::Env &env) { static Acpica::Main main(env); }

View File

@ -3,7 +3,7 @@ include $(REP_DIR)/lib/import/import-av.inc
TARGET = avplay TARGET = avplay
SRC_C = avplay.c cmdutils.c libc_dummies.c SRC_C = avplay.c cmdutils.c libc_dummies.c
LIBS += avfilter avformat avcodec avutil avresample swscale LIBS += avfilter avformat avcodec avutil avresample swscale
LIBS += sdl libc libm config_args LIBS += sdl posix config_args
CC_WARN += -Wno-parentheses -Wno-switch -Wno-uninitialized \ CC_WARN += -Wno-parentheses -Wno-switch -Wno-uninitialized \
-Wno-format-zero-length -Wno-pointer-sign -Wno-format-zero-length -Wno-pointer-sign

View File

@ -1,3 +1,3 @@
TARGET = eglgears TARGET = eglgears
SRC_C = eglgears.c SRC_C = eglgears.c
LIBS = libc libm gallium LIBS = posix gallium

View File

@ -2,7 +2,7 @@ MUPDF_DIR := $(call select_from_ports,mupdf)/src/lib/mupdf
TARGET := mupdf TARGET := mupdf
SRC_C := pdfapp.c SRC_C := pdfapp.c
SRC_CC := main.cc SRC_CC := main.cc
LIBS := libc mupdf LIBS := posix mupdf
INC_DIR += $(MUPDF_DIR)/apps INC_DIR += $(MUPDF_DIR)/apps
vpath pdfapp.c $(MUPDF_DIR)/apps vpath pdfapp.c $(MUPDF_DIR)/apps

View File

@ -15,3 +15,5 @@ vpath % $(QMAKE_PROJECT_PATH)
include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_defaults.inc include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_defaults.inc
include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc
LIBS += posix

View File

@ -15,3 +15,5 @@ vpath % $(QMAKE_PROJECT_PATH)
include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_defaults.inc include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_defaults.inc
include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc
LIBS += posix

View File

@ -15,3 +15,5 @@ vpath % $(QMAKE_PROJECT_PATH)
include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_defaults.inc include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_defaults.inc
include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc
LIBS += posix

View File

@ -36,3 +36,5 @@ $(addprefix $(BUILD_BASE_DIR)/bin/qt5_fs/$(TARGET)/, $(SAMEGAME3_RESOURCES)): $(
$(addprefix $(BUILD_BASE_DIR)/bin/qt5_fs/$(TARGET)/shared/pics/, $(SAMEGAME_RESOURCES)): $(BUILD_BASE_DIR)/bin/qt5_fs/$(TARGET)/shared/pics $(addprefix $(BUILD_BASE_DIR)/bin/qt5_fs/$(TARGET)/shared/pics/, $(SAMEGAME_RESOURCES)): $(BUILD_BASE_DIR)/bin/qt5_fs/$(TARGET)/shared/pics
$(VERBOSE)ln -sf $(QT5_CONTRIB_DIR)/qtdeclarative/examples/quick/tutorials/samegame/shared/pics/$(notdir $@) $@ $(VERBOSE)ln -sf $(QT5_CONTRIB_DIR)/qtdeclarative/examples/quick/tutorials/samegame/shared/pics/$(notdir $@) $@
LIBS += posix

View File

@ -17,3 +17,5 @@ include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_defaults.inc
CC_CXX_OPT += -DQT_NO_SCRIPTTOOLS CC_CXX_OPT += -DQT_NO_SCRIPTTOOLS
include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc
LIBS += posix

View File

@ -16,3 +16,4 @@ include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_defaults.inc
include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc
LIBS += posix

View File

@ -18,8 +18,7 @@
#include "main_window.h" #include "main_window.h"
/* Genode includes */ /* Genode includes */
#include <base/component.h> #include <libc/component.h>
#include <base/printf.h>
static inline void load_stylesheet() static inline void load_stylesheet()
@ -38,7 +37,7 @@ static inline void load_stylesheet()
extern int genode_argc; extern int genode_argc;
extern char **genode_argv; extern char **genode_argv;
void Component::construct(Genode::Env &env) void Libc::Component::construct(Genode::Env &env)
{ {
QApplication app(genode_argc, genode_argv); QApplication app(genode_argc, genode_argv);

View File

@ -27,3 +27,4 @@ $(BUILD_BASE_DIR)/bin/qt5_fs/$(TARGET)/player_stop.png: $(BUILD_BASE_DIR)/bin/qt
$(BUILD_BASE_DIR)/bin/qt5_fs/$(TARGET)/volume.png: $(BUILD_BASE_DIR)/bin/qt5_fs/$(TARGET) $(BUILD_BASE_DIR)/bin/qt5_fs/$(TARGET)/volume.png: $(BUILD_BASE_DIR)/bin/qt5_fs/$(TARGET)
$(VERBOSE)ln -sf $(QT5_CONTRIB_DIR)/qtwebkit/Source/WebKit/efl/DefaultTheme/widget/mediacontrol/mutebutton/unmutebutton.png $@ $(VERBOSE)ln -sf $(QT5_CONTRIB_DIR)/qtwebkit/Source/WebKit/efl/DefaultTheme/widget/mediacontrol/mutebutton/unmutebutton.png $@

View File

@ -12,7 +12,7 @@
#include <QApplication> #include <QApplication>
/* Genode includes */ /* Genode includes */
#include <base/component.h> #include <libc/component.h>
#include <base/env.h> #include <base/env.h>
extern int genode_argc; extern int genode_argc;
@ -56,7 +56,8 @@ struct Qt_launchpad_namespace::Local_env : Genode::Env
void close(Parent::Client::Id id) { return genode_env.close(id); } void close(Parent::Client::Id id) { return genode_env.close(id); }
}; };
void Component::construct(Genode::Env &env)
void Libc::Component::construct(Genode::Env &env)
{ {
static Qt_launchpad_namespace::Local_env local_env(env); static Qt_launchpad_namespace::Local_env local_env(env);

View File

@ -6,3 +6,4 @@ include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_defaults.inc
include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc
LIBS += posix

View File

@ -19,6 +19,9 @@
#include <base/rpc_client.h> #include <base/rpc_client.h>
#include <base/heap.h> #include <base/heap.h>
/* libc includes */
#include <libc/component.h>
/* libc-internal includes */ /* libc-internal includes */
#include <internal/call_func.h> #include <internal/call_func.h>
#include <base/internal/unmanaged_singleton.h> #include <base/internal/unmanaged_singleton.h>
@ -41,12 +44,7 @@
} while (0) } while (0)
namespace Libc { namespace Libc { class Task; }
class Task;
void (*original_call_component_construct)(Genode::Env &);
void call_component_construct(Genode::Env &env);
}
struct Task_resume struct Task_resume
@ -56,9 +54,6 @@ struct Task_resume
}; };
Genode::size_t Component::stack_size() {
return 32UL * 1024 * sizeof(Genode::addr_t); }
/** /**
* Libc task * Libc task
* *
@ -165,7 +160,7 @@ class Libc::Task : public Genode::Rpc_object<Task_resume, Libc::Task>
void Libc::Task::_app_entry(Task *task) void Libc::Task::_app_entry(Task *task)
{ {
original_call_component_construct(task->_env); Libc::Component::construct(task->_env);
/* returned from task - switch stack to libc and return to dispatch loop */ /* returned from task - switch stack to libc and return to dispatch loop */
_longjmp(task->_libc_task, 1); _longjmp(task->_libc_task, 1);
@ -190,31 +185,37 @@ namespace Libc {
void schedule_suspend(void (*suspended) ()) void schedule_suspend(void (*suspended) ())
{ {
if (!task) {
error("libc task handling not initialized, needed for suspend");
return;
}
task->schedule_suspend(suspended); task->schedule_suspend(suspended);
} }
} }
/**************************** /***************************
** Component-startup hook ** ** Component entry point **
****************************/ ***************************/
/* XXX needs base-internal header? */ Genode::size_t Component::stack_size() { return Libc::Component::stack_size(); }
namespace Genode { extern void (*call_component_construct)(Genode::Env &); }
void Libc::call_component_construct(Genode::Env &env)
void Component::construct(Genode::Env &env)
{ {
/* pass Genode::Env to libc subsystems that depend on it */ /* pass Genode::Env to libc subsystems that depend on it */
init_dl(env); Libc::init_dl(env);
task = unmanaged_singleton<Libc::Task>(env); task = unmanaged_singleton<Libc::Task>(env);
task->run(); task->run();
} }
static void __attribute__((constructor)) libc_task_constructor(void) /**
{ * Default stack size for libc-using components
/* hook into component startup */ */
Libc::original_call_component_construct = Genode::call_component_construct; Genode::size_t Libc::Component::stack_size() __attribute__((weak));
Genode::call_component_construct = &Libc::call_component_construct; Genode::size_t Libc::Component::stack_size() {
} return 32UL * 1024 * sizeof(Genode::addr_t); }

View File

@ -0,0 +1,32 @@
/*
* \brief Entry point for POSIX applications
* \author Norman Feske
* \date 2016-12-23
*/
/*
* Copyright (C) 2016 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.
*/
/* Genode includes */
#include <libc/component.h>
/* libc includes */
#include <stdlib.h> /* for 'exit' */
extern char **genode_argv;
extern int genode_argc;
extern char **genode_envp;
/* provided by the application */
extern "C" int main(int argc, char ** argv, char **envp);
void Libc::Component::construct(Genode::Env &env)
{
exit(main(genode_argc, genode_argv, genode_envp));
}

View File

@ -13,19 +13,8 @@
#ifdef QT_MAIN_STACK_SIZE #ifdef QT_MAIN_STACK_SIZE
#include <base/thread.h> #include <libc/component.h>
using namespace Genode; Genode::size_t Libc::Component::stack_size() { return QT_MAIN_STACK_SIZE; }
extern int qt_main(int argc, char *argv[]);
#define qt_main main
int main(int argc, char *argv[])
{
Genode::Thread::myself()->stack_size(QT_MAIN_STACK_SIZE);
return qt_main(argc, argv);
}
#endif /* QT_MAIN_STACK_SIZE */ #endif /* QT_MAIN_STACK_SIZE */

View File

@ -6,7 +6,7 @@ SRC_C = $(notdir $(EXFAT_DIR)/fuse/main.c)
SRC_CC = fuse_fs_main.cc \ SRC_CC = fuse_fs_main.cc \
init.cc init.cc
LIBS = base config server libc libfuse libexfat LIBS = config libc libfuse libexfat
INC_DIR += $(PRG_DIR)/.. INC_DIR += $(PRG_DIR)/..
CC_OPT += -Wno-unused-function CC_OPT += -Wno-unused-function

View File

@ -9,7 +9,7 @@ SRC_C = $(filter-out $(FILTER_OUT), $(notdir $(wildcard $(FUSE_EXT2_DIR)/*.c)))
SRC_CC = fuse_fs_main.cc \ SRC_CC = fuse_fs_main.cc \
init.cc init.cc
LIBS = base config server libc libfuse libext2fs LIBS = config libc libfuse libext2fs
CC_OPT += -DHAVE_CONFIG_H -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 CC_OPT += -DHAVE_CONFIG_H -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64

View File

@ -17,10 +17,10 @@
#include <file_system_session/rpc_object.h> #include <file_system_session/rpc_object.h>
#include <os/attached_rom_dataspace.h> #include <os/attached_rom_dataspace.h>
#include <os/config.h> #include <os/config.h>
#include <os/server.h>
#include <os/session_policy.h> #include <os/session_policy.h>
#include <root/component.h> #include <root/component.h>
#include <util/xml_node.h> #include <util/xml_node.h>
#include <libc/component.h>
/* libc includes */ /* libc includes */
#include <errno.h> #include <errno.h>
@ -41,13 +41,13 @@ class File_system::Session_component : public Session_rpc_object
{ {
private: private:
Server::Entrypoint &_ep; Genode::Entrypoint &_ep;
Allocator &_md_alloc; Allocator &_md_alloc;
Directory &_root; Directory &_root;
Node_handle_registry _handle_registry; Node_handle_registry _handle_registry;
bool _writeable; bool _writeable;
Signal_rpc_member<Session_component> _process_packet_dispatcher; Signal_handler<Session_component> _process_packet_handler;
/****************************** /******************************
@ -115,10 +115,10 @@ class File_system::Session_component : public Session_rpc_object
} }
/** /**
* Called by signal dispatcher, executed in the context of the main * Called by signal handler, executed in the context of the main
* thread (not serialized with the RPC functions) * thread (not serialized with the RPC functions)
*/ */
void _process_packets(unsigned) void _process_packets()
{ {
while (tx_sink()->packet_avail()) { while (tx_sink()->packet_avail()) {
@ -158,7 +158,7 @@ class File_system::Session_component : public Session_rpc_object
* Constructor * Constructor
*/ */
Session_component(size_t tx_buf_size, Session_component(size_t tx_buf_size,
Server::Entrypoint &ep, Genode::Entrypoint &ep,
char const *root_dir, char const *root_dir,
bool writeable, bool writeable,
Allocator &md_alloc) Allocator &md_alloc)
@ -168,10 +168,10 @@ class File_system::Session_component : public Session_rpc_object
_md_alloc(md_alloc), _md_alloc(md_alloc),
_root(*new (&_md_alloc) Directory(_md_alloc, root_dir, false)), _root(*new (&_md_alloc) Directory(_md_alloc, root_dir, false)),
_writeable(writeable), _writeable(writeable),
_process_packet_dispatcher(_ep, *this, &Session_component::_process_packets) _process_packet_handler(_ep, *this, &Session_component::_process_packets)
{ {
_tx.sigh_packet_avail(_process_packet_dispatcher); _tx.sigh_packet_avail(_process_packet_handler);
_tx.sigh_ready_to_ack(_process_packet_dispatcher); _tx.sigh_ready_to_ack(_process_packet_handler);
} }
/** /**
@ -408,7 +408,7 @@ class File_system::Root : public Root_component<Session_component>
{ {
private: private:
Server::Entrypoint &_ep; Genode::Entrypoint &_ep;
protected: protected:
@ -501,7 +501,7 @@ class File_system::Root : public Root_component<Session_component>
* data-flow signals of packet streams * data-flow signals of packet streams
* \param md_alloc meta-data allocator * \param md_alloc meta-data allocator
*/ */
Root(Server::Entrypoint &ep, Allocator &md_alloc) Root(Genode::Entrypoint &ep, Allocator &md_alloc)
: :
Root_component<Session_component>(&ep.rpc_ep(), &md_alloc), Root_component<Session_component>(&ep.rpc_ep(), &md_alloc),
_ep(ep) _ep(ep)
@ -511,7 +511,7 @@ class File_system::Root : public Root_component<Session_component>
struct File_system::Main struct File_system::Main
{ {
Server::Entrypoint &ep; Genode::Entrypoint &ep;
/* /*
* Initialize root interface * Initialize root interface
@ -520,7 +520,7 @@ struct File_system::Main
Root fs_root = { ep, sliced_heap }; Root fs_root = { ep, sliced_heap };
Main(Server::Entrypoint &ep) : ep(ep) Main(Genode::Entrypoint &ep) : ep(ep)
{ {
if (!Fuse::init_fs()) { if (!Fuse::init_fs()) {
Genode::error("FUSE fs initialization failed"); Genode::error("FUSE fs initialization failed");
@ -539,10 +539,12 @@ struct File_system::Main
}; };
/********************** /***************
** Server framework ** ** Component **
**********************/ ***************/
void Libc::Component::construct(Genode::Env &env)
{
static File_system::Main inst(env.ep());
}
char const * Server::name() { return "fuse_fs_ep"; }
Genode::size_t Server::stack_size() { return 16*1024*sizeof(long); }
void Server::construct(Server::Entrypoint &ep) { static File_system::Main inst(ep); }

View File

@ -6,7 +6,7 @@ SRC_C := ntfs-3g.c ntfs-3g_common.c
SRC_CC := fuse_fs_main.cc \ SRC_CC := fuse_fs_main.cc \
init.cc init.cc
LIBS := base config server libc libfuse libntfs-3g LIBS := config libc libfuse libntfs-3g
CC_OPT := -DHAVE_TIMESPEC -DHAVE_CONFIG_H -DRECORD_LOCKING_NOT_IMPLEMENTED CC_OPT := -DHAVE_TIMESPEC -DHAVE_CONFIG_H -DRECORD_LOCKING_NOT_IMPLEMENTED

View File

@ -1,3 +1,3 @@
TARGET = test-expat TARGET = test-expat
SRC_CC = main.cc SRC_CC = main.cc
LIBS = expat libc LIBS = expat posix

View File

@ -15,7 +15,7 @@
#include <rom_session/connection.h> #include <rom_session/connection.h>
#include <base/env.h> #include <base/env.h>
#include <base/heap.h> #include <base/heap.h>
#include <base/component.h> #include <libc/component.h>
#include <base/shared_object.h> #include <base/shared_object.h>
using namespace Genode; using namespace Genode;
@ -185,7 +185,7 @@ static void test_shared_object_api(Env &env, Allocator &alloc)
/** /**
* Main function of LDSO test * Main function of LDSO test
*/ */
void Component::construct(Genode::Env &env) void Libc::Component::construct(Genode::Env &env)
{ {
static Heap heap(env.ram(), env.rm()); static Heap heap(env.ram(), env.rm());

View File

@ -1,3 +1,3 @@
TARGET = test-libc TARGET = test-libc
SRC_CC = main.cc SRC_CC = main.cc
LIBS = libm libc LIBS = posix

View File

@ -1,3 +1,3 @@
TARGET = test-libc_block TARGET = test-libc_block
LIBS = libc LIBS = posix
SRC_CC = main.cc SRC_CC = main.cc

View File

@ -1,3 +1,3 @@
TARGET = test-libc_ffat TARGET = test-libc_ffat
LIBS = libc libc_ffat LIBS = posix libc_ffat
SRC_CC = main.cc SRC_CC = main.cc

View File

@ -1,3 +1,3 @@
TARGET = test-libc_pipe TARGET = test-libc_pipe
LIBS = libc libc_pipe pthread LIBS = posix libc_pipe pthread
SRC_CC = main.cc SRC_CC = main.cc

View File

@ -1,3 +1,3 @@
TARGET = test-libc_resolv TARGET = test-libc_resolv
SRC_CC = main.cc SRC_CC = main.cc
LIBS = libc libc_resolv LIBS = posix libc_resolv

View File

@ -1,5 +1,5 @@
TARGET = test-libc_vfs TARGET = test-libc_vfs
LIBS = libc LIBS = posix
SRC_CC = main.cc SRC_CC = main.cc
# we re-use the libc_ffat test # we re-use the libc_ffat test

View File

@ -11,4 +11,6 @@
* under the terms of the GNU General Public License version 2. * under the terms of the GNU General Public License version 2.
*/ */
int main() { } #include <libc/component.h>
void Libc::Component::construct(Genode::Env &) { }

View File

@ -1,5 +1,5 @@
TARGET = test-http_clnt TARGET = test-http_clnt
LIBS = lwip libc LIBS = lwip posix
SRC_CC = main.cc SRC_CC = main.cc
INC_DIR += $(REP_DIR)/src/lib/lwip/include INC_DIR += $(REP_DIR)/src/lib/lwip/include

View File

@ -1,5 +1,5 @@
TARGET = test-lwip_httpsrv TARGET = test-lwip_httpsrv
LIBS = lwip libc LIBS = lwip posix
SRC_CC = main.cc SRC_CC = main.cc
INC_DIR += $(REP_DIR)/src/lib/lwip/include INC_DIR += $(REP_DIR)/src/lib/lwip/include

View File

@ -1,5 +1,5 @@
TARGET = test-lwip_httpsrv_static TARGET = test-lwip_httpsrv_static
LIBS = lwip libc config LIBS = lwip posix config
SRC_CC = main.cc SRC_CC = main.cc
INC_DIR += $(REP_DIR)/src/lib/lwip/include INC_DIR += $(REP_DIR)/src/lib/lwip/include

View File

@ -1,3 +1,3 @@
TARGET = test-lwip_loop TARGET = test-lwip_loop
LIBS = lwip libc libc_lwip_loopback LIBS = lwip posix libc_lwip_loopback
SRC_CC = main.cc SRC_CC = main.cc

View File

@ -1,5 +1,5 @@
TARGET = test-ping_client_libc_lwip TARGET = test-ping_client_libc_lwip
LIBS = base libc lwip libc_lwip_nic_dhcp config_args LIBS = posix lwip libc_lwip_nic_dhcp config_args
SRC_CC = main.cc pingpong.cc SRC_CC = main.cc pingpong.cc
vpath main.cc $(PRG_DIR)/.. vpath main.cc $(PRG_DIR)/..

View File

@ -1,5 +1,5 @@
TARGET = test-ping_client_lwip TARGET = test-ping_client_lwip
LIBS = base libc lwip config_args LIBS = posix lwip config_args
SRC_CC = main.cc pingpong.cc SRC_CC = main.cc pingpong.cc
INC_DIR += $(REP_DIR)/src/lib/lwip/include INC_DIR += $(REP_DIR)/src/lib/lwip/include

View File

@ -1,5 +1,5 @@
TARGET = test-ping_server_libc_lwip TARGET = test-ping_server_libc_lwip
LIBS = base libc libc_lwip_nic_dhcp libc_lwip lwip config_args LIBS = posix libc_lwip_nic_dhcp libc_lwip lwip config_args
SRC_CC = main.cc pingpong.cc SRC_CC = main.cc pingpong.cc
vpath main.cc $(PRG_DIR)/.. vpath main.cc $(PRG_DIR)/..

View File

@ -1,5 +1,5 @@
TARGET = test-ping_server_lwip TARGET = test-ping_server_lwip
LIBS = base libc lwip config_args LIBS = posix lwip config_args
SRC_CC = main.cc pingpong.cc SRC_CC = main.cc pingpong.cc
CC_OPT += -DLWIP_NATIVE CC_OPT += -DLWIP_NATIVE

View File

@ -1,3 +1,3 @@
TARGET = test-moon TARGET = test-moon
LIBS = luacxx libc libm LIBS = luacxx posix
SRC_CC = main.cc SRC_CC = main.cc

View File

@ -1,3 +1,3 @@
TARGET = test-pthread TARGET = test-pthread
SRC_CC = main.cc SRC_CC = main.cc
LIBS = libc pthread LIBS = posix pthread

View File

@ -1,4 +1,4 @@
TARGET = test-python TARGET = test-python
LIBS = python libc libm LIBS = python posix
REQUIRES = x86 REQUIRES = x86
SRC_CC = main.cc SRC_CC = main.cc

View File

@ -15,3 +15,5 @@ test-plugin.tar: config.plugin
clean: clean:
$(VERBOSE)rm test-plugin.tar $(VERBOSE)rm test-plugin.tar
LIBS += posix

View File

@ -1,4 +1,5 @@
TARGET = test-rust TARGET = test-rust
SRC_RS = main.rs SRC_RS = main.rs
SRC_CC = printf.cc SRC_CC = printf.cc
LIBS = libcore-rust libcollections-rust base librustc_unicode-rust liballoc-rust liblibc-rust liballoc_system-rust LIBS = libcore-rust libcollections-rust base librustc_unicode-rust \
liballoc-rust liblibc-rust liballoc_system-rust posix

View File

@ -1,3 +1,3 @@
TARGET = test-sdl TARGET = test-sdl
LIBS = sdl libc LIBS = sdl posix
SRC_CC = main.cc SRC_CC = main.cc

View File

@ -1,5 +1,5 @@
TARGET = test-smartcard TARGET = test-smartcard
LIBS = pcsc-lite libc LIBS = pcsc-lite posix
SRC_CC = main.cc SRC_CC = main.cc
vpath main.cc $(PRG_DIR)/.. vpath main.cc $(PRG_DIR)/..

View File

@ -1,3 +1,3 @@
TARGET = test-stdcxx TARGET = test-stdcxx
SRC_CC = main.cc SRC_CC = main.cc
LIBS = base stdcxx LIBS = posix stdcxx

View File

@ -2,6 +2,7 @@
#include <block_session/connection.h> #include <block_session/connection.h>
#include <os/server.h> #include <os/server.h>
#include <timer_session/connection.h> #include <timer_session/connection.h>
#include <libc/component.h>
#include <stdio.h> #include <stdio.h>
@ -153,13 +154,7 @@ struct Test::Main
}; };
namespace Server { void Libc::Component::construct(Genode::Env &env)
char const *name() { return "block_bench_ep"; };
Genode::size_t stack_size() { return 16*1024*sizeof(long); }
void construct(Entrypoint &ep)
{ {
static Test::Main server(ep); static Test::Main server(env.ep());
}
} }

View File

@ -1,3 +1,3 @@
TARGET = test-blk-bench TARGET = test-blk-bench
SRC_CC = main.cc SRC_CC = main.cc
LIBS = base server libc LIBS = base libc

View File

@ -30,7 +30,7 @@
TARGET ?= $(lastword $(subst /, ,$(PRG_DIR))) TARGET ?= $(lastword $(subst /, ,$(PRG_DIR)))
PKG ?= $(TARGET) PKG ?= $(TARGET)
LIBS += libc libm LIBS += posix
PWD = $(shell pwd) PWD = $(shell pwd)
@ -107,18 +107,9 @@ CXXFLAGS += $(COMMON_CFLAGS_CXXFLAGS)
# Unfortunately, the use of '--start-group' and '--end-group' does not suffice # Unfortunately, the use of '--start-group' and '--end-group' does not suffice
# in all cases because 'libtool' strips those arguments from the 'LIBS' variable. # in all cases because 'libtool' strips those arguments from the 'LIBS' variable.
# #
# Furthermore, 'libtool' reorders library names on the command line in a way that
# shared libraries appear before static libraries. This has the unfortunate effect
# that the program's entry symbol 'Genode::component_entry_point' in the static
# library 'component_entry_point.lib.a' is not found anymore. Passing the static
# library names as linker arguments (-Wl,...) works around this problem, because
# 'libtool' keeps command line arguments before the shared library names.
#
LDLIBS_A = $(filter %.a, $(sort $(LINK_ITEMS)) $(EXT_OBJECTS) $(LIBGCC)) LDLIBS_A = $(filter %.a, $(sort $(LINK_ITEMS)) $(EXT_OBJECTS) $(LIBGCC))
LDLIBS_SO = $(filter %.so,$(sort $(LINK_ITEMS)) $(EXT_OBJECTS) $(LIBGCC)) LDLIBS_SO = $(filter %.so,$(sort $(LINK_ITEMS)) $(EXT_OBJECTS) $(LIBGCC))
comma := , LDLIBS += $(LDLIBS_A) $(LDLIBS_SO) $(LDLIBS_A)
LDLIBS += $(addprefix -Wl$(comma),$(LDLIBS_A)) $(LDLIBS_SO) $(LDLIBS_A)
# #
# Re-configure the Makefile if the Genode build environment changes # Re-configure the Makefile if the Genode build environment changes

View File

@ -84,3 +84,5 @@ vpath % $(ARORA_PORT_DIR)/src/app/arora/src/useragent
vpath % $(ARORA_PORT_DIR)/src/app/arora/src/utils vpath % $(ARORA_PORT_DIR)/src/app/arora/src/utils
-include $(QT_TMPL_DIR)/target_final.inc -include $(QT_TMPL_DIR)/target_final.inc
LIBS += posix

View File

@ -53,5 +53,5 @@ CC_WARN += -Wno-unused-variable -Wno-unused-function -Wno-switch -Wno-unused-val
-Wno-sign-compare -Wno-narrowing -Wno-missing-braces -Wno-array-bounds \ -Wno-sign-compare -Wno-narrowing -Wno-missing-braces -Wno-array-bounds \
-Wno-parentheses -Wno-parentheses
LIBS += libc libm libpng sdl sdl_net stdcxx zlib LIBS += posix libpng sdl sdl_net stdcxx zlib
LIBS += libc_lwip_nic_dhcp config_args LIBS += libc_lwip_nic_dhcp config_args

View File

@ -11,7 +11,7 @@
* under the terms of the GNU General Public License version 2. * under the terms of the GNU General Public License version 2.
*/ */
#include <base/component.h> #include <libc/component.h>
/* /*
* Suppress messages of libc dummy functions * Suppress messages of libc dummy functions
@ -33,7 +33,7 @@ extern "C" int gdbserver_main(int argc, const char *argv[]);
extern Genode::Env *genode_env; extern Genode::Env *genode_env;
void Component::construct(Genode::Env &env) void Libc::Component::construct(Genode::Env &env)
{ {
genode_env = &env; genode_env = &env;

Some files were not shown because too many files have changed in this diff Show More