adonis0147 / devel-env

Devel-env is aimed to set the development environment up on Linux server WITHOUT root privileges.
4 stars 1 forks source link

Running extraction script twice on the same target folder will seemingly confuse it and result in a broken gcc binary #4

Closed ell1e closed 2 weeks ago

ell1e commented 2 weeks ago

(This project rocks :sunglasses: so I hope those findings are helpful for improving it further)

Running extraction script twice on the same target folder will seemingly confuse it and result in a broken gcc binary.

The toolchain version I tested was this one: https://github.com/adonis0147/devel-env/releases/download/v2024.10/install_toolchain_x86_64.sh

Watch here how I extract it once and it works, then I repeat it and I can no longer run gcc --help afterward:

# ./install_toolchain_x86_64.sh test
[ INFO  ] 2024-10-28 19:43:28 - The toolchain will be extracted to /home/test .
[ INFO  ] 2024-10-28 19:43:28 - Extracting the toolchain...
[ INFO  ] 2024-10-28 19:43:33 - Success!
[ INFO  ] 2024-10-28 19:43:33 - Configuring the toolchain...
[ INFO  ] 2024-10-28 19:43:33 - Program patchelf was found: /home/test/compiler/bin/patchelf
[ INFO  ] 2024-10-28 19:43:33 - Interpreter was found: /home/test/compiler/lib/ld-linux-x86-64.so.2
[ INFO  ] 2024-10-28 19:43:33 - Library was found: /home/test/compiler/lib/libc.so.6
[ INFO  ] 2024-10-28 19:44:00 - Completed!
[ INFO  ] 2024-10-28 19:44:00 - Before using the toolchain, please run the following command first:

    export PATH="/home/test/compiler/bin:${PATH}"

# test/compiler/bin/gcc --help
Usage: gcc [options] file...
Options:
  -pass-exit-codes         Exit with highest error code from a phase.
  --help                   Display this information.
  --target-help            Display target specific command line options (including assembler and linker options).
  --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...].
                           Display specific types of command line options.
  (Use '-v --help' to display command line options of sub-processes).
  --version                Display compiler version information.
  -dumpspecs               Display all of the built in spec strings.
  -dumpversion             Display the version of the compiler.
  -dumpmachine             Display the compiler's target processor.
  -foffload=<targets>      Specify offloading targets.
  -print-search-dirs       Display the directories in the compiler's search path.
  -print-libgcc-file-name  Display the name of the compiler's companion library.
  -print-file-name=<lib>   Display the full path to library <lib>.
  -print-prog-name=<prog>  Display the full path to compiler component <prog>.
  -print-multiarch         Display the target's normalized GNU triplet, used as
                           a component in the library path.
  -print-multi-directory   Display the root directory for versions of libgcc.
  -print-multi-lib         Display the mapping between command line options and
                           multiple library search directories.
  -print-multi-os-directory Display the relative path to OS libraries.
  -print-sysroot           Display the target libraries directory.
  -print-sysroot-headers-suffix Display the sysroot suffix used to find headers.
  -Wa,<options>            Pass comma-separated <options> on to the assembler.
  -Wp,<options>            Pass comma-separated <options> on to the preprocessor.
  -Wl,<options>            Pass comma-separated <options> on to the linker.
  -Xassembler <arg>        Pass <arg> on to the assembler.
  -Xpreprocessor <arg>     Pass <arg> on to the preprocessor.
  -Xlinker <arg>           Pass <arg> on to the linker.
  -save-temps              Do not delete intermediate files.
  -save-temps=<arg>        Do not delete intermediate files.
  -no-canonical-prefixes   Do not canonicalize paths when building relative
                           prefixes to other gcc components.
  -pipe                    Use pipes rather than intermediate files.
  -time                    Time the execution of each subprocess.
  -specs=<file>            Override built-in specs with the contents of <file>.
  -std=<standard>          Assume that the input sources are for <standard>.
  --sysroot=<directory>    Use <directory> as the root directory for headers
                           and libraries.
  -B <directory>           Add <directory> to the compiler's search paths.
  -v                       Display the programs invoked by the compiler.
  -###                     Like -v but options quoted and commands not executed.
  -E                       Preprocess only; do not compile, assemble or link.
  -S                       Compile only; do not assemble or link.
  -c                       Compile and assemble, but do not link.
  -o <file>                Place the output into <file>.
  -pie                     Create a dynamically linked position independent
                           executable.
  -shared                  Create a shared library.
  -x <language>            Specify the language of the following input files.
                           Permissible languages include: c c++ assembler none
                           'none' means revert to the default behavior of
                           guessing the language based on the file's extension.

Options starting with -g, -f, -m, -O, -W, or --param are automatically
 passed on to the various sub-processes invoked by gcc.  In order to pass
 other options on to these processes the -W<letter> options must be used.

For bug reporting instructions, please see:
<https://gcc.gnu.org/bugs/>.
# ./install_toolchain_x86_64.sh test
[ INFO  ] 2024-10-28 19:45:04 - The toolchain will be extracted to /home/test .
[ INFO  ] 2024-10-28 19:45:04 - Extracting the toolchain...
[ INFO  ] 2024-10-28 19:45:09 - Success!
[ INFO  ] 2024-10-28 19:45:09 - Configuring the toolchain...
[ INFO  ] 2024-10-28 19:45:09 - Program patchelf was found: /home/test/compiler/bin/patchelf
[ INFO  ] 2024-10-28 19:45:09 - Interpreter was found: /home/test/compiler/lib/ld-linux-x86-64.so.2
/home/test/compiler/tmp.FjzLTNSUkA/lib/ld-linux-x86-64.so.2
[ INFO  ] 2024-10-28 19:45:09 - Library was found: /home/test/compiler/lib/libc.so.6
/home/test/compiler/tmp.FjzLTNSUkA/lib/libc.so.6
patchelf: getting info about '/home/test/compiler/lib/libc.so.6
/home/test/compiler/tmp.FjzLTNSUkA/lib/libc.so.6': No such file or directory
# test/compiler/bin/gcc --help
bash: test/compiler/bin/gcc: cannot execute: required file not found
adonis0147 commented 2 weeks ago

Hi @ell1e , thanks for reporting this issue. I think the main branch has fixed it. You can use the following commands to patch the latest release and check whether the script works as expect.

curl -L 'https://raw.githubusercontent.com/adonis0147/devel-env/refs/heads/main/toolchain/setup_toolchain.sh' >install_toolchain.sh
curl -L 'https://github.com/adonis0147/devel-env/releases/download/v2024.10/install_toolchain_x86_64.sh' -o - | sed '1,/^# -\*- EOF -\*-$/d' >>install_toolchain.sh
chmod a+x install_toolchain.sh
ell1e commented 2 weeks ago

I am now getting this error, which I assume is what is intended to happen: 48.04 [ ERROR ] 2024-10-29 08:53:55 - Failed to extract the toolchain due to the target directory already exists. Thanks so much for the fix :heart: