diff --git a/ld/ld.texinfo b/ld/ld.texinfo index 6c74ff5..1830306 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -2718,7 +2718,10 @@ You can change the behaviour of @command{ld} with the environment variables @ifclear SingleFormat @code{GNUTARGET}, @end ifclear -@code{LDEMULATION} and @code{COLLECT_NO_DEMANGLE}. +@code{LDEMULATION}, +@code{COLLECT_NO_DEMANGLE} +and +@code{LD_ALTEXEC}. @ifclear SingleFormat @kindex GNUTARGET @@ -2756,6 +2759,12 @@ a similar fashion by the @code{gcc} linker wrapper program. The default may be overridden by the @samp{--demangle} and @samp{--no-demangle} options. +@kindex LD_ALTEXEC +@cindex alternative linker +@code{LD_ALTEXEC} sets alternative linker. @command{ld} executes, +and passes control to this alternative linker. For instance one +can set @code{LD_ALTEXEC=echo} to debug linker command line. + @c man end @end ifset diff --git a/ld/ldmain.c b/ld/ldmain.c index b2810a7..8b5612f 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -52,6 +52,7 @@ #endif #include +#include #ifdef HAVE_SBRK #if !HAVE_DECL_SBRK @@ -173,12 +174,38 @@ ld_cleanup (void) unlink_if_ordinary (output_filename); } +static void +maybe_altexec(char **argv) +{ + char *LD_ALTEXEC; + + /* If LD_ALTEXEC is not set or is empty, just return */ + LD_ALTEXEC = getenv("LD_ALTEXEC"); + if (LD_ALTEXEC == NULL) + return; + + if (*LD_ALTEXEC == '\0') + return; + + /* Unset LD_ALTEXEC for case when it points to this program itself ;-) */ + if (unsetenv("LD_ALTEXEC")) + exit(errno); + + argv[0] = LD_ALTEXEC; + execvp(LD_ALTEXEC, argv); + + /* We are here only if execvp() failed */ + exit(errno); +} + int main (int argc, char **argv) { char *emulation; long start_time = get_run_time (); + maybe_altexec(argv); + #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) setlocale (LC_MESSAGES, ""); #endif