diff options
Diffstat (limited to 'lang/icc11/files/ld.c')
-rw-r--r-- | lang/icc11/files/ld.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lang/icc11/files/ld.c b/lang/icc11/files/ld.c new file mode 100644 index 00000000000..b1c454cf412 --- /dev/null +++ b/lang/icc11/files/ld.c @@ -0,0 +1,45 @@ +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <sys/syslimits.h> +#include <unistd.h> + +#include "util.h" + +int main(int argc, char* argv[]) +{ + int i; + char *s; + char emul[PATH_MAX]; + + for(i = 1; i < argc; i++) { + if(strcmp(argv[i], "-ldl") == 0) + argv[i] = "-licc11bsd"; + else if(strcmp(argv[i], "/usr/lib/crt1.o") == 0) + argv[i] = "/usr/lib/crt0.o"; + else if(strcmp(argv[i], "/usr/lib64/crt1.o") == 0) + argv[i] = "/usr/lib/crt0.o"; + else if(strcmp(argv[i], "/lib/ld-linux.so.2") == 0) + argv[i] = "/usr/libexec/ld.elf_so"; + else if(strcmp(argv[i], "/lib64/ld-linux-x86-64.so.2") == 0) + argv[i] = "/usr/libexec/ld.elf_so"; + else if(strncmp(argv[i], "/tmp/i", 6) == 0) { + strlcpy(emul, EMULDIR, sizeof(emul)); + strlcpy(emul + EMULDIR_LEN, argv[i], sizeof(emul) - EMULDIR_LEN); + move_tmpicc(emul); + } + } + + if((s = getenv("ICC11_REALLD")) == NULL) + s = "ld"; + argv[0] = s; + + execvp(s, argv); + + s = strerror(errno); + write(STDERR_FILENO, argv[0], strlen(argv[0])); + write(STDERR_FILENO, ": ", 3); + write(STDERR_FILENO, s, strlen(s)); + write(STDERR_FILENO, "\n", 1); + return EXIT_FAILURE; +} |