root/src/system/runtime_loader/export.cpp
/*
 * Copyright 2003-2011, Axel Dörfler, axeld@pinc-software.de.
 * Distributed under the terms of the MIT License.
 *
 * Copyright 2002, Manuel J. Petit. All rights reserved.
 * Distributed under the terms of the NewOS License.
 */


#include "runtime_loader_private.h"
#include "commpage.h"
#include "elf_tls.h"


// exported via the rld_export structure in user space program arguments


static image_id
export_load_add_on(char const *name, uint32 flags)
{
        void* handle;
        return load_library(name, flags, true, NULL, &handle);
}


static status_t
export_unload_add_on(image_id id)
{
        return unload_library(NULL, id, true);
}


static image_id
export_load_library(char const *name, uint32 flags, void* caller,
        void **_handle)
{
        return load_library(name, flags, false, caller, _handle);
}


static status_t
export_unload_library(void* handle)
{
        return unload_library(handle, -1, false);
}


status_t
reinit_after_fork()
{
        status_t returnstatus = B_OK;
        if (status_t status = elf_reinit_after_fork())
                returnstatus = status;
        if (status_t status = heap_reinit_after_fork())
                returnstatus = status;
        if (status_t status = commpage_reinit_after_fork())
                returnstatus = status;
        return returnstatus;
}


struct rld_export gRuntimeLoader = {
        // dynamic loading support API
        export_load_add_on,
        export_unload_add_on,
        export_load_library,
        export_unload_library,
        get_symbol,
        get_library_symbol,
        get_nth_symbol,
        get_nearest_symbol_at_address,
        test_executable,
        get_executable_architecture,
        get_next_image_dependency,
        get_tls_address,
        destroy_thread_tls,

        reinit_after_fork,
        NULL, // call_atexit_hooks_for_range
        terminate_program,

        // the following values will be set later
        NULL,   // program_args
        NULL,   // commpage_address
        0               // ABI version
};

rld_export* __gRuntimeLoader = &gRuntimeLoader;


void
rldexport_init(void)
{
        gRuntimeLoader.program_args = gProgramArgs;
        gRuntimeLoader.commpage_address = __gCommPageAddress;
}


/*!     Is called for all images, and sets the minimum ABI version found to the
        gRuntimeLoader.abi_version field and the minimum API version found to the
        gRuntimeLoader.api_version field.
*/
void
set_abi_api_version(int abi_version, int api_version)
{
        if (gRuntimeLoader.abi_version == 0
                || gRuntimeLoader.abi_version > abi_version) {
                gRuntimeLoader.abi_version = abi_version;
        }
        if (gRuntimeLoader.api_version == 0
                || gRuntimeLoader.api_version > api_version) {
                gRuntimeLoader.api_version = api_version;
        }
}