Compatible with ld.bfd, gold, lld and mold. Also, document existing
behaviour of LD_SO environment variable
---
 libtcc.c     | 7 +++++++
 tcc-doc.texi | 5 +++++
 tcc.c        | 2 ++
 tcc.h        | 1 +
 tccelf.c     | 4 +++-
 5 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/libtcc.c b/libtcc.c
index 44cca386..1c4b4a55 100644
--- a/libtcc.c
+++ b/libtcc.c
@@ -1428,6 +1428,13 @@ static int tcc_set_linker(TCCState *s, const char 
*option)
             s->rdynamic = 1;
         } else if (link_option(option, "rpath=", &p)) {
             copy_linker_arg(&s->rpath, p, ':');
+        } else if (link_option(option, "dynamic-linker=", &p)
+                || link_option(option, "I=", &p)) {
+            copy_linker_arg(&s->elfint, p, 0);
+        } else if (strncmp("-I/", option, 3) == 0
+                || strncmp("-I.", option, 3) == 0) {
+            p = option;
+            copy_linker_arg(&s->elfint, option + 2, 0);
         } else if (link_option(option, "enable-new-dtags", &p)) {
             s->enable_new_dtags = 1;
         } else if (link_option(option, "section-alignment=", &p)) {
diff --git a/tcc-doc.texi b/tcc-doc.texi
index 62aabf99..47acb528 100644
--- a/tcc-doc.texi
+++ b/tcc-doc.texi
@@ -360,6 +360,11 @@ Generate an object file combining all input files.
 @item -Wl,-rpath=path
 Put custom search path for dynamic libraries into executable.
 
+@item -Wl,-Ipath
+@item -Wl,--dynamic-linker=path
+Set the ELF interpreter (dynamic linker). This defaults to the value of the
+environment variable @env{LD_SO} if set, or a compiled-in default.
+
 @item -Wl,--enable-new-dtags
 When putting a custom search path for dynamic libraries into the executable,
 create the new ELF dynamic tag DT_RUNPATH instead of the old legacy DT_RPATH.
diff --git a/tcc.c b/tcc.c
index 0363d5aa..abe1a70a 100644
--- a/tcc.c
+++ b/tcc.c
@@ -152,6 +152,8 @@ static const char help2[] =
     "  -soname=                      set DT_SONAME elf tag\n"
 #if defined(TCC_TARGET_MACHO)
     "  -install_name=                set DT_SONAME elf tag (soname macOS 
alias)\n"
+#else
+    "  -Ipath, -dynamic-linker=path  set ELF interpreter to path"
 #endif
     "  -Bsymbolic                    set DT_SYMBOLIC elf tag\n"
     "  -oformat=[elf32/64-* binary]  set executable output format\n"
diff --git a/tcc.h b/tcc.h
index 84e27bc2..44da52f1 100644
--- a/tcc.h
+++ b/tcc.h
@@ -802,6 +802,7 @@ struct TCCState {
     char *tcc_lib_path; /* CONFIG_TCCDIR or -B option */
     char *soname; /* as specified on the command line (-soname) */
     char *rpath; /* as specified on the command line (-Wl,-rpath=) */
+    char *elfint; /* -Wl,-I on command line, LD_SO in environment, or 
DEFAULT_ELFINTERP(this) */
     char *elf_entryname; /* "_start" unless set */
     char *init_symbol; /* symbols to call at load-time (not used currently) */
     char *fini_symbol; /* symbols to call at unload-time (not used currently) 
*/
diff --git a/tccelf.c b/tccelf.c
index 2ac52b1d..7df46f98 100644
--- a/tccelf.c
+++ b/tccelf.c
@@ -2850,7 +2850,9 @@ static int elf_output_file(TCCState *s1, const char 
*filename)
             if (file_type & TCC_OUTPUT_EXE) {
                 char *ptr;
                 /* allow override the dynamic loader */
-                const char *elfint = getenv("LD_SO");
+                const char *elfint = s1->elfint;
+                if (elfint == NULL)
+                    elfint = getenv("LD_SO");
                 if (elfint == NULL)
                     elfint = DEFAULT_ELFINTERP(s1);
                 /* add interpreter section only if executable */
-- 
2.48.1


_______________________________________________
Tinycc-devel mailing list
Tinycc-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to