| From b31e9b1bff6832063816b972395179859d1d4619 Mon Sep 17 00:00:00 2001 |
| From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> |
| Date: Sun, 13 Aug 2017 16:03:20 +0200 |
| Subject: [PATCH] ld-elf2flt: behave properly when called with a name different |
| from TARGET_ALIAS |
| |
| ld-elf2flt currently handles two cases: |
| |
| 1 It is called as the wrapper for <TARGET_ALIAS>-ld, generally |
| installed in the bin/ directory of a toolchain. |
| |
| 2 It is called as the wrapper for "ld", generally installed in the |
| TARGET_ALIAS/bin/ directory of a toolchain. |
| |
| Unfortunately, if for some reason it gets called using a FOOBAR-ld |
| name that is different from <TARGET_ALIAS>-ld, it assumes it is in |
| case (2), while it really is in case (1). Due to this, the path |
| mangling logic doesn't work, and it doesn't find ld.real. |
| |
| This happens for example when the binary program in bin/ is named |
| arm-buildroot-uclinux-uclibcgnueabi-ld, but also has a simpler symlink |
| named arm-linux-ld. In this case, |
| arm-buildroot-uclinux-uclibcgnueabi-ld is recognized by ld-elf2flt as |
| containing TARGET_ALIAS, and therefore the proper logic to find |
| ld.real is applied. However, when arm-linux-ld is used, ld-elf2flt |
| doesn't find TARGET_ALIAS, and therefore assumes we're being called as |
| TARGET_ALIAS/bin/ld.. and searches for a program called ld.real in |
| bin/, which doesn't exist. |
| |
| See: |
| |
| $ ./output/host/bin/arm-buildroot-uclinux-uclibcgnueabi-ld |
| /home/thomas/buildroot/buildroot/output/host/bin/../arm-buildroot-uclinux-uclibcgnueabi/bin/ld.real: no input files |
| |
| $ ./output/host/bin/arm-linux-ld |
| arm-linux-ld (ld-elf2flt): error trying to exec '/home/thomas/buildroot/buildroot/output/host/bin/ld.real': execvp: No such file or directory |
| |
| $ ./output/host/arm-buildroot-uclinux-uclibcgnueabi/bin/ld |
| /home/thomas/buildroot/buildroot/output/host/arm-buildroot-uclinux-uclibcgnueabi/bin/ld.real: no input files |
| |
| This commit fixes that by inverting the logic: if we're being called |
| as just "ld", then we assume it's the program in |
| TARGET_ALIAS/bin/. Otherwise, we're called through some variant of |
| TARGET-ld. |
| |
| Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> |
| Submitted-upstream: https://github.com/uclinux-dev/elf2flt/pull/8 |
| --- |
| ld-elf2flt.c | 10 +++++----- |
| 1 file changed, 5 insertions(+), 5 deletions(-) |
| |
| diff --git a/ld-elf2flt.c b/ld-elf2flt.c |
| index de39fe0..c187c2e 100644 |
| --- a/ld-elf2flt.c |
| +++ b/ld-elf2flt.c |
| @@ -506,15 +506,15 @@ int main(int argc, char *argv[]) |
| the host while those in <TARGET_ALIAS>/lib are for the target. |
| Make bindir point to the bin dir for bin/<TARGET_ALIAS>-foo. |
| Make tooldir point to the bin dir for <TARGET_ALIAS>/bin/foo. */ |
| - if (streqn(elf2flt_progname, TARGET_ALIAS)) { |
| - tmp = concat(argv0_dir, "../" TARGET_ALIAS "/bin", NULL); |
| + if (streqn(elf2flt_progname, "ld")) { |
| + tmp = concat(argv0_dir, "../../bin", NULL); |
| if (stat(tmp, &buf) == 0 && S_ISDIR(buf.st_mode)) { |
| - tooldir = concat(tmp, "/", NULL); |
| + bindir = concat(tmp, "/", NULL); |
| } |
| } else { |
| - tmp = concat(argv0_dir, "../../bin", NULL); |
| + tmp = concat(argv0_dir, "../" TARGET_ALIAS "/bin", NULL); |
| if (stat(tmp, &buf) == 0 && S_ISDIR(buf.st_mode)) { |
| - bindir = concat(tmp, "/", NULL); |
| + tooldir = concat(tmp, "/", NULL); |
| } |
| } |
| |
| -- |
| 2.9.4 |
| |