0

I created symbolic links to the exe files in a bin directory using these bash scripts:

dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ cat do_links.sh
./make_links.sh as
./make_links.sh nm
./make_links.sh ar
./make_links.sh ranlib
./make_links.sh strip
./make_links.sh objdump
./make_links.sh ld
./make_links.sh gcov
./make_links.sh gcc-4.0.1
./make_links.sh gcc
./make_links.sh gprof
./make_links.sh gccbug
./make_links.sh g++
./make_links.sh c++
./make_links.sh strings
./make_links.sh c++filt
./make_links.sh size
./make_links.sh cpp
./make_links.sh readelf
./make_links.sh addr2line
./make_links.sh objcopy
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ cat make_links.sh
ln -s arm-unknown-linux-gnu-$1 $1

then I ran ./do_links.sh in the bin directory and this is what the bin directory looks like:

dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ lt
total 26552
-rwxr-xr-x 2 dan dan 2566199 May 30 16:44 arm-unknown-linux-gnu-as
-rwxr-xr-x 2 dan dan 1762396 May 30 16:44 arm-unknown-linux-gnu-nm
-rwxr-xr-x 2 dan dan 1706104 May 30 16:44 arm-unknown-linux-gnu-ar
-rwxr-xr-x 2 dan dan 1706099 May 30 16:44 arm-unknown-linux-gnu-ranlib
-rwxr-xr-x 2 dan dan 2203025 May 30 16:44 arm-unknown-linux-gnu-strip
-rwxr-xr-x 2 dan dan 2346625 May 30 16:44 arm-unknown-linux-gnu-objdump
-rwxr-xr-x 2 dan dan 2471491 May 30 16:44 arm-unknown-linux-gnu-ld
-rwxr-xr-x 1 dan dan   67493 May 30 16:44 arm-unknown-linux-gnu-gcov
-rwxr-xr-x 2 dan dan  201417 May 30 16:44 arm-unknown-linux-gnu-gcc-4.0.1
-rwxr-xr-x 2 dan dan  201417 May 30 16:44 arm-unknown-linux-gnu-gcc
-rwxr-xr-x 1 dan dan 2013095 May 30 16:44 arm-unknown-linux-gnu-gprof
-rwxr-xr-x 1 dan dan   16196 May 30 16:44 arm-unknown-linux-gnu-gccbug
-rwxr-xr-x 2 dan dan  206621 May 30 16:44 arm-unknown-linux-gnu-g++
-rwxr-xr-x 2 dan dan  206621 May 30 16:44 arm-unknown-linux-gnu-c++
-rwxr-xr-x 1 dan dan 1602788 May 30 16:44 arm-unknown-linux-gnu-strings
-rwxr-xr-x 1 dan dan 1692490 May 30 16:44 arm-unknown-linux-gnu-c++filt
-rwxrwxr-x 1 dan dan   12281 May 30 16:44 fix-embedded-paths
-rwxr-xr-x 1 dan dan 1620406 May 30 16:44 arm-unknown-linux-gnu-size
-rwxr-xr-x 1 dan dan  202864 May 30 16:44 arm-unknown-linux-gnu-cpp
-rwxr-xr-x 1 dan dan  398151 May 30 16:44 arm-unknown-linux-gnu-readelf
-rwxr-xr-x 1 dan dan 1727820 May 30 16:44 arm-unknown-linux-gnu-addr2line
-rwxr-xr-x 1 dan dan 2203026 May 30 16:44 arm-unknown-linux-gnu-objcopy
-rwxrwxr-x 1 dan dan     339 May 30 18:31 check_ver.sh
-rwxrwxr-x 1 dan dan     460 May 30 19:09 do_links.sh
-rwxr-xr-x 1 dan dan     129 May 30 19:13 make_links.sh
lrwxrwxrwx 1 dan dan      24 May 30 19:38 as -> arm-unknown-linux-gnu-as
lrwxrwxrwx 1 dan dan      24 May 30 19:38 nm -> arm-unknown-linux-gnu-nm
lrwxrwxrwx 1 dan dan      28 May 30 19:38 ranlib -> arm-unknown-linux-gnu-ranlib
lrwxrwxrwx 1 dan dan      24 May 30 19:38 ar -> arm-unknown-linux-gnu-ar
lrwxrwxrwx 1 dan dan      27 May 30 19:38 strip -> arm-unknown-linux-gnu-strip
lrwxrwxrwx 1 dan dan      29 May 30 19:38 objdump -> arm-unknown-linux-gnu-objdump
lrwxrwxrwx 1 dan dan      24 May 30 19:38 ld -> arm-unknown-linux-gnu-ld
lrwxrwxrwx 1 dan dan      26 May 30 19:38 gcov -> arm-unknown-linux-gnu-gcov
lrwxrwxrwx 1 dan dan      31 May 30 19:38 gcc-4.0.1 -> arm-unknown-linux-gnu-gcc-4.0.1
lrwxrwxrwx 1 dan dan      25 May 30 19:38 gcc -> arm-unknown-linux-gnu-gcc
lrwxrwxrwx 1 dan dan      27 May 30 19:38 gprof -> arm-unknown-linux-gnu-gprof
lrwxrwxrwx 1 dan dan      28 May 30 19:38 gccbug -> arm-unknown-linux-gnu-gccbug
lrwxrwxrwx 1 dan dan      25 May 30 19:38 g++ -> arm-unknown-linux-gnu-g++
lrwxrwxrwx 1 dan dan      25 May 30 19:38 c++ -> arm-unknown-linux-gnu-c++
lrwxrwxrwx 1 dan dan      29 May 30 19:38 strings -> arm-unknown-linux-gnu-strings
lrwxrwxrwx 1 dan dan      29 May 30 19:38 c++filt -> arm-unknown-linux-gnu-c++filt
lrwxrwxrwx 1 dan dan      26 May 30 19:38 size -> arm-unknown-linux-gnu-size
lrwxrwxrwx 1 dan dan      25 May 30 19:38 cpp -> arm-unknown-linux-gnu-cpp
lrwxrwxrwx 1 dan dan      29 May 30 19:38 readelf -> arm-unknown-linux-gnu-readelf
lrwxrwxrwx 1 dan dan      31 May 30 19:38 addr2line -> arm-unknown-linux-gnu-addr2line
lrwxrwxrwx 1 dan dan      29 May 30 19:38 objcopy -> arm-unknown-linux-gnu-objcopy

So I can execute the symbolic link in that directory:

dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

but when I try to execute the sym link anywhere else:

dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ cd ..
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu$ bin/gcc --version
bash: bin/gcc: No such file or directory

Just for fun, I created a bash script in the bin directory:

dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ echo "gcc --version" > check.sh
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ chmod +x check.sh
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ ./check.sh
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ cd ..
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu$ bin/check.sh
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

and it works fine from any other directory.

then I thought it was conflicting with the other gcc and changed the link name to gcc2:

dan@Linux-Desktop:~$ which gcc
/usr/bin/gcc
dan@Linux-Desktop:~$ which gcc2
/home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin/gcc2
dan@Linux-Desktop:~$ gcc2 --version
bash: /home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin/gcc2: No such file or directory

I can't even run the explicit exe from any other directory:

dan@Linux-Desktop:~$ cat testd.sh
ls -ltr /home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc
/home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc --version
dan@Linux-Desktop:~$ ./testd.sh
-rwxr-xr-x 2 dan dan 201417 May 30 16:44 /home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc
./testd.sh: line 2: /home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc: No such file or directory
dan@Linux-Desktop:~$

This is my PATH:

dan@Linux-Desktop:~$ printenv PATH
/home/dan/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/dan/java/jdk-11.0.11+9/bin:/home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin
Kamil Maciorowski
  • 69,815
  • 22
  • 136
  • 202

1 Answers1

0

Hypothesis: the executable you're trying to run is for an incompatible architecture

The program was compiled for an incompatible architecture, resulting in a non-executable program. The error message stating "does not exist" instead of "invalid executable" is just a very misleading message.

or it misses required libraries.

In particular:

  1. When in the directory, gcc --version runs gcc from somewhere else in your PATH, not the file (symlink) present in the directory. It's probably /usr/bin/gcc. The title is "can't execute symbolic links to exes unless in the directory where the links are located" but the "unless" part is a misinterpretation. In the directory you did not run the symlink. ./gcc --version would run it.
  2. When in the parent directory, bin/gcc --version tries to run the symlink and it points to arm-unknown-linux-gnu-gcc which triggers the misleading error per the hypothesis.
  3. The shell script check.sh worked either way because the first place to find it via your PATH was the directory and the problem does not apply to running the script itself. Note gcc inside the script was located via PATH like in (1) and it worked like in (1).
  4. The link named gcc2 never works because there is no gcc2 in directories earlier in the PATH. The only gcc2 is the symlink in the directory and it points to the problematic executable.
  5. The script testd.sh explicitly calls arm-unknown-linux-gnu-gcc by its full path and the problem occurs.
Kamil Maciorowski
  • 69,815
  • 22
  • 136
  • 202