Permalink
Browse files

Dynamic linking on amd64 (WIP)

After modifying HelenOS.config, it is possible to build with dynamic
linking support, but an attempt to load a shared library will fail.
  • Loading branch information...
Jiri Svoboda
Jiri Svoboda committed Jan 7, 2018
1 parent 9c4df21 commit d3e938c65a5927cb5851ec4118dd05109bba3ada
@@ -55,6 +55,12 @@
#define FUNCTION_END(func) \
SYMBOL_END(func)

#ifdef __PIC__
#define FUNCTION_REF(func) func@PLT
#else
#define FUNCTION_REF(func) func
#endif

#endif

/** @}
@@ -33,7 +33,9 @@ ARCH_SOURCES = \
arch/$(UARCH)/src/fibril.S \
arch/$(UARCH)/src/tls.c \
arch/$(UARCH)/src/stacktrace.c \
arch/$(UARCH)/src/stacktrace_asm.S
arch/$(UARCH)/src/stacktrace_asm.S \
arch/$(UARCH)/src/rtld/dynamic.c \
arch/$(UARCH)/src/rtld/reloc.c

ARCH_AUTOCHECK_HEADERS = \
arch/$(UARCH)/include/libarch/fibril_context.h
@@ -0,0 +1,45 @@
/*
* Copyright (c) 2016 Jiri Svoboda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/** @addtogroup generic
* @{
*/
/** @file
*/

#ifndef LIBC_amd64_RTLD_DYNAMIC_H_
#define LIBC_amd64_RTLD_DYNAMIC_H_

typedef struct {
/* Empty. */
} dyn_info_arch_t;

#endif

/** @}
*/
@@ -0,0 +1,52 @@
/*
* Copyright (c) 2016 Jiri Svoboda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/** @addtogroup generic
* @{
*/
/** @file amd64 dynamic relocation types
*/

#ifndef LIBC_amd64_RTLD_ELF_DYN_H_
#define LIBC_amd64_RTLD_ELF_DYN_H_

#define R_X86_64_64 1
#define R_X86_64_PC32 2
#define R_X86_64_COPY 5
#define R_X86_64_GLOB_DAT 6
#define R_X86_64_JUMP_SLOT 7
#define R_X86_64_RELATIVE 8

#define R_X86_64_DTPMOD64 16
#define R_X86_64_DTPOFF64 17
#define R_X86_64_TPOFF64 18

#endif

/** @}
*/
@@ -44,6 +44,8 @@
typedef struct {
void *self;
void *fibril_data;
void **dtv;
void *pad;
} tcb_t;

static inline void __tcb_raw_set(void *tls)
@@ -46,4 +46,4 @@ SYMBOL(_start)

# %rdi was deliberately chosen as the first argument is also in %rdi
# Pass PCB pointer to __c_start (no operation)
call __c_start
call FUNCTION_REF(__c_start)
@@ -0,0 +1,51 @@
/*
* Copyright (c) 2016 Jiri Svoboda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/** @addtogroup libcia32
* @brief
* @{
*/
/**
* @file
*/

#include <stdio.h>
#include <stdlib.h>

#include <rtld/elf_dyn.h>
#include <rtld/dynamic.h>

void dyn_parse_arch(elf_dyn_t *dp, size_t bias, dyn_info_t *info)
{
(void) dp;
(void) bias;
(void) info;
}

/** @}
*/
Oops, something went wrong.

0 comments on commit d3e938c

Please sign in to comment.