Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

macOS: retdec-* breaks due to explicit use of #!/bin/bash #258

Closed
AshKetch-um opened this issue Mar 29, 2018 · 2 comments
Closed

macOS: retdec-* breaks due to explicit use of #!/bin/bash #258

AshKetch-um opened this issue Mar 29, 2018 · 2 comments

Comments

@AshKetch-um
Copy link
Contributor

AshKetch-um commented Mar 29, 2018

On macOS the built-in bash and the associated tools are incompatible with many different things being done by retdec-* scripts. The solution is for this is to use homebrew or Mac Ports to provide a GNU compatible environment (see: Run on MacOS).

There are a number of complicating factors between homebrew/ports and GNU-targeted tools however, one of the key issues is the collisions between built-in tools (e.g. bash, sed, redline) and those provided by these package managers. A common solution is to place the path to the GNU tools symlink tree earlier in the PATH than the built-in tools (e.g. export PATH=/opt/local/bin:/opt/local/sbin:/opt/local/libexec/gnubin) thus allowing GNU targeted tools to work without having to be specifically aware of the quirks of macOS/brew/ports.

Most of these issues have been identified and resolved as part of the README.md however, the retdec-* scripts explicitly utilize #!/bin/bash which will cause them to execute using the built-in bash rather than that of the current shell. This results in retdec-* only working when run using a dedicated brew/ports bash instance (not the current shell) and when run from the installation directory of retdec. This is because the explicit #!/bin/bash is causing the built-in bash to be used in place of the currently running shell, causing cascading issues in a number of different places (see: Observed Behavior below).

The fix that worked for me is replacing the explicit usage of #!/bin/bash in all to the shell scripts with the more environmentally friendly version #!/usr/bin/env bash. This allows the running shell (e.g. /opt/local/bin/bash to be used and thus, allows retdec's installation path to included into the PATH and thus run from anywhere. ( Pull Request #259 )

Environment
macOS 10.13.3
Bash: 4.4.19(1)-release (x86_64-apple-darwin17.4.0)
Mac Ports
changeset: 31cf35f

Steps to Reproduce
Download, Build and Install on MacOS

sudo port selfupdate
# See #257
sudo port install cmake git perl5 python27 bison flex autoconf automake libtool coreutils wget gsed doxygen upx graphviz

# See #98
export PATH=/opt/local/bin:/opt/local/sbin:/opt/local/libexec/gnubin:$PATH

git clone https://github.com/avast-tl/retdec
cd retdec
mkdir build && cd build
cmake .. -DCMAKE_INSTALLPREFIX=/opt/local/retdec
make -j6
sudo make install

Run against a simple test 32-bit Linux ELF binary

export PATH=$PATH:/opt/local/retdec/bin
retdec-decompiler.sh /tmp/test

Expected Behavior
Clean run

user@host: ~$ retdec-decompiler.sh /tmp/test
...
Running phase: emission of the target code [c] ( 0.03s )
Running phase: finalization ( 0.03s )
Running phase: cleanup ( 0.04s )

##### Done!

Observed Behavior
Run from path directly on current shell:

user@host:~$ retdec-decompiler.sh /tmp/test
##### Checking if file is a Mach-O Universal static library...
RUN: /opt/local/retdec/bin/retdec-macho-extractor --list /private/tmp/test

##### Checking if file is an archive...
RUN: /opt/local/retdec/bin/retdec-ar-extractor --arch-magic /private/tmp/test
Not an archive, going to the next step.
/opt/local/retdec/bin/retdec-decompiler.sh: line 967: unexpected EOF while looking for matching `"'
/opt/local/retdec/bin/retdec-decompiler.sh: line 968: syntax error: unexpected end of file

Run from path using dedicate bash instance:

user@host:~$ bash retdec-decompiler.sh /tmp/test
/opt/local/retdec/bin/retdec-decompiler.sh: line 12: ./retdec-utils.sh: No such file or directory
/opt/local/retdec/bin/retdec-decompiler.sh: line 156: get_realpath: command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 157: get_realpath: command not found
##### Checking if file is a Mach-O Universal static library...
RUN:  --list 
/opt/local/retdec/bin/retdec-decompiler.sh: line 501: is_macho_archive: command not found

##### Checking if file is an archive...
RUN:  --arch-magic 
/opt/local/retdec/bin/retdec-decompiler.sh: line 527: has_archive_signature: command not found
Not an archive, going to the next step.

##### Gathering file information...
RUN:  -c .json --similarity  --no-hashes=all
/opt/local/retdec/bin/retdec-decompiler.sh: line 648: : command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 654: print_error_and_die: command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 662: : command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 709: : command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 715: : command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 736: print_error_and_die: command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 741: : command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 744: print_error_and_die: command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 754: : command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 184: : command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 792: : command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 814: : command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 815: : command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 816: : command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 822: : command not found

##### Decompiling  into .backend.bc...
RUN:  -provider-init -config-path .json -decoder -o .backend.bc
/opt/local/retdec/bin/retdec-decompiler.sh: line 868: : command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 873: print_error_and_die: command not found

##### Decompiling .backend.bc into ...
RUN:  -target-hll=c -var-renamer=readable -var-name-gen=fruit -var-name-gen-prefix= -call-info-obtainer=optim -arithm-expr-evaluator=c -validate-module -llvmir2bir-converter=orig -o  .backend.bc -enable-debug -emit-debug-comments -config-path=.json
/opt/local/retdec/bin/retdec-decompiler.sh: line 922: : command not found
/opt/local/retdec/bin/retdec-decompiler.sh: line 927: print_error_and_die: command not found
sed: can't read : No such file or directory
sed: can't read : No such file or directory

##### Done!

Run from same directory as install directly from current shell:

user@host:~$ ./retdec-decompiler.sh /tmp/test
##### Checking if file is a Mach-O Universal static library...
RUN: /opt/local/retdec/bin/retdec-macho-extractor --list /private/tmp/test

##### Checking if file is an archive...
RUN: /opt/local/retdec/bin/retdec-ar-extractor --arch-magic /private/tmp/test
Not an archive, going to the next step.
./retdec-decompiler.sh: line 967: unexpected EOF while looking for matching `"'
./retdec-decompiler.sh: line 968: syntax error: unexpected end of file

Run from install directory of retdec with a dedicate bash instance:

user@host:~$ cd /opt/local/retdec/bin
user@host:/opt/local/retdec/bin/$ bash ./retdec-decompiler.sh /tmp/test
...
Running phase: emission of the target code [c] ( 0.03s )
Running phase: finalization ( 0.03s )
Running phase: cleanup ( 0.04s )

##### Done!
AshKetch-um added a commit to AshKetch-um/retdec that referenced this issue Mar 29, 2018
s3rvac added a commit that referenced this issue Mar 30, 2018
Issue #258: Replace usage of explicit '#!/bin/bash' with more environmentally friendly '#!/usr/bin/env bash'
@s3rvac s3rvac self-assigned this Mar 30, 2018
@s3rvac
Copy link
Member

s3rvac commented Mar 30, 2018

Thank you for the very well-written report and your PR #259, which fixes the issue!

@s3rvac s3rvac closed this as completed Mar 30, 2018
@AshKetch-um
Copy link
Contributor Author

Happy to help - thanks for the quick response!

s3rvac added a commit to avast/retdec-idaplugin that referenced this issue Mar 30, 2018
mbandzi pushed a commit that referenced this issue Apr 9, 2018
enviromentally friendly '#!/usr/bin/env'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants