From a06fef3b11e863cd689582123a8d6a625fc82fbc Mon Sep 17 00:00:00 2001 From: Christian Jullien Date: Tue, 8 Dec 2020 09:13:29 +0100 Subject: [PATCH] FreeBSD: little better support that targets FreeBSD 12.2 on amd64 but still not working - WIP --- libtcc.c | 5 +++++ tccelf.c | 14 +++++++++----- tccrun.c | 2 +- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/libtcc.c b/libtcc.c index edac4bcf..82217f60 100644 --- a/libtcc.c +++ b/libtcc.c @@ -1105,6 +1105,11 @@ LIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type) if (output_type != TCC_OUTPUT_DLL) tcc_add_crt(s, "crt0.o"); tcc_add_crt(s, "crtbegin.o"); +#elif defined(__FreeBSD__) + if (output_type != TCC_OUTPUT_DLL) + tcc_add_crt(s, "crt1.o"); + tcc_add_crt(s, "crti.o"); + tcc_add_crt(s, "crtbegin.o"); #elif !defined(TCC_TARGET_MACHO) /* Mach-O with LC_MAIN doesn't need any crt startup code. */ if (output_type != TCC_OUTPUT_DLL) diff --git a/tccelf.c b/tccelf.c index 74e1f008..2442a3bb 100644 --- a/tccelf.c +++ b/tccelf.c @@ -1431,10 +1431,14 @@ ST_FUNC void tcc_add_runtime(TCCState *s1) #endif if (strlen(TCC_LIBTCC1) > 0) tcc_add_support(s1, TCC_LIBTCC1); -#if defined(__OpenBSD__) +#if defined(__OpenBSD__) || defined(__FreeBSD__) /* add crt end if not memory output */ - if (s1->output_type != TCC_OUTPUT_MEMORY) + if (s1->output_type != TCC_OUTPUT_MEMORY) { tcc_add_crt(s1, "crtend.o"); +#if defined(__FreeBSD__) + tcc_add_crt(s1, "crtn.o"); +#endif + } #elif !defined(TCC_TARGET_MACHO) /* add crt end if not memory output */ if (s1->output_type != TCC_OUTPUT_MEMORY) @@ -2066,7 +2070,7 @@ static void fill_dynamic(TCCState *s1, struct dyn_inf *dyninf) put_dt(dynamic, DT_RELA, dyninf->rel_addr); put_dt(dynamic, DT_RELASZ, dyninf->rel_size); put_dt(dynamic, DT_RELAENT, sizeof(ElfW_Rel)); -#ifdef __OpenBSD__ +#if defined(__OpenBSD__) || defined(__FreeBSD__) put_dt(dynamic, DT_PLTGOT, s1->got->sh_addr); put_dt(dynamic, DT_PLTRELSZ, dyninf->rel_size); put_dt(dynamic, DT_JMPREL, dyninf->rel_addr); @@ -2399,7 +2403,7 @@ static void create_arm_attribute_section(TCCState *s1) } #endif -#ifdef __OpenBSD__ +#if defined(__OpenBSD__) static Section *create_openbsd_note_section(TCCState *s1) { Section *s = find_section (s1, ".note.openbsd.ident"); @@ -2757,7 +2761,7 @@ ST_FUNC int tcc_load_object_file(TCCState *s1, #ifdef TCC_ARM_EABI sh->sh_type != SHT_ARM_EXIDX && #endif -#ifdef __OpenBSD__ +#if defined(__OpenBSD__) || defined(__FreeBSD__) sh->sh_type != SHT_X86_64_UNWIND && sh->sh_type != SHT_NOTE && #endif diff --git a/tccrun.c b/tccrun.c index e57c1e8c..a603946a 100644 --- a/tccrun.c +++ b/tccrun.c @@ -155,7 +155,7 @@ LIBTCCAPI int tcc_run(TCCState *s1, int argc, char **argv) #ifdef CONFIG_TCC_BACKTRACE rt_context *rc = &g_rtctxt; #endif -# if defined(__APPLE__) +# if defined(__APPLE__) || defined(__FreeBSD__) char **envp = NULL; #else char **envp = environ; -- 2.11.4.GIT