12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- 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
|