

Discover more from Learn Pentesting like a Pro!
🧮 How to install solc in Linux and compile smart contracts
Learn how to compile Solidity smart contracts easily
To install the latest version, the best option is to compile directly from the official Github repository:
https://github.com/ethereum/solidity.git
There are two requirements prior to build solc, we need to install cmake and the development libraries of Boost:
# apt-get install cmake libboost-all-dev
After that, we can clone the solidity repository, as shown below:
$ git clone --recursive https://github.com/ethereum/solidity.git
$ cd solidity/
$ git submodule update --init --recursive
Finally, we can run a script to compile and run all tests automatically:
$ sudo ./scripts/build.sh
-- Found Boost headers in
-- Found Boost::filesystem at
-- Found Boost::unit_test_framework at
-- Found Boost::program_options at
-- Found Boost::system at
-- Module support is disabled.
-- Version: 8.0.1
-- Build type: Release
-- CXX_STANDARD: 17
-- Required features: cxx_variadic_templates
-- Performing Test fmacro-prefix-map=/home/user/solidity=/solidity
-- Performing Test fmacro-prefix-map=/home/user/solidity=/solidity - Success
------------------------------------------------------------------------
-- Configuring solidity 0.8.14
------------------------------------------------------------------------
-- CMake Version 3.18.4
-- CMAKE_BUILD_TYPE Build type Release
-- TARGET_PLATFORM Target platform Linux
--------------------------------------------------------------- features
-- COVERAGE Coverage support OFF
------------------------------------------------------------- components
-- TESTS Build tests ON
------------------------------------------------------------------ flags
-- OSSFUZZ OFF
------------------------------------------------------------------------
-- Could NOT find Z3 (missing: Z3_LIBRARY Z3_INCLUDE_DIR)
No SMT solver found (or it has been forcefully disabled). Optional SMT checking will not be available.
Please install Z3 or CVC4 or remove the option disabling them (USE_Z3, USE_CVC4).
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/solidity/build
[ 2%] Built target range-v3-project
[ 4%] Built target jsoncpp-project
[ 4%] Built target fmt
[ 5%] Built target evmc_loader
[ 5%] Built target solidity_BuildInfo.h
[ 8%] Built target solutil
[ 11%] Built target langutil
[ 12%] Built target smtutil
[ 16%] Built target evmasm
[ 37%] Built target yul
[ 38%] Built target strictasm_opt_ossfuzz
Scanning dependencies of target solidity
[ 39%] Built target strictasm_assembly_ossfuzz
[ 39%] Building CXX object libsolidity/CMakeFiles/solidity.dir/interface/Version.cpp.o
[ 39%] Linking CXX static library libsolidity.a
[ 57%] Built target solidity
[ 57%] Built target libsolc
[ 60%] Built target phaser
Scanning dependencies of target solcli
[ 60%] Linking CXX executable solidity-upgrade
[ 60%] Building CXX object solc/CMakeFiles/solcli.dir/CommandLineInterface.cpp.o
[ 62%] Built target solidity-upgrade
[ 63%] Built target yulInterpreter
[ 63%] Linking CXX executable yulopti
[ 63%] Built target yulopti
[ 63%] Linking CXX executable solfuzzer
[ 64%] Built target solfuzzer
[ 65%] Linking CXX executable yulrun
[ 65%] Built target yulrun
[ 65%] Built target strictasm_diff_ossfuzz
[ 65%] Built target const_opt_ossfuzz
[ 66%] Built target solc_mutator_ossfuzz
[ 67%] Built target solc_ossfuzz
[ 67%] Linking CXX executable yul-phaser
[ 68%] Built target yul-phaser
[ 68%] Linking CXX executable isoltest
[ 76%] Built target isoltest
[ 76%] Linking CXX static library libsolcli.a
[ 76%] Built target solcli
[ 76%] Linking CXX executable solc
[ 76%] Linking CXX executable soltest
[ 76%] Built target solc
[100%] Built target soltest
Installing ...
[ 0%] Built target solidity_BuildInfo.h
[ 2%] Built target range-v3-project
[ 4%] Built target jsoncpp-project
[ 4%] Built target fmt
[ 7%] Built target solutil
[ 10%] Built target langutil
[ 11%] Built target smtutil
[ 15%] Built target evmasm
[ 36%] Built target yul
[ 54%] Built target solidity
[ 54%] Built target libsolc
[ 57%] Built target phaser
[ 58%] Built target yul-phaser
[ 60%] Built target solidity-upgrade
[ 60%] Built target solcli
[ 60%] Built target solc
[ 61%] Built target evmc_loader
[ 62%] Built target yulInterpreter
[ 86%] Built target soltest
[ 94%] Built target isoltest
[ 94%] Built target yulopti
[ 95%] Built target solfuzzer
[ 96%] Built target yulrun
[ 97%] Built target strictasm_opt_ossfuzz
[ 97%] Built target strictasm_diff_ossfuzz
[ 98%] Built target strictasm_assembly_ossfuzz
[ 98%] Built target const_opt_ossfuzz
[ 99%] Built target solc_mutator_ossfuzz
[100%] Built target solc_ossfuzz
Install the project...
-- Install configuration: "Release"
-- Installing: /usr/local/bin/solidity-upgrade
-- Installing: /usr/local/bin/yul-phaser
-- Installing: /usr/local/bin/solc
It seems it was successfully compiled and installed. Let’s verify:
$ solc --version
solc, the solidity compiler commandline interface
Version: 0.8.14-develop.2022.3.21+commit.430ecb6e.Linux.g++
To understand better what parameters we can pass to solc
, we can try with --help
flag:
$ solc --help
solc, the Solidity commandline compiler.
This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you
are welcome to redistribute it under certain conditions. See 'solc --license'
for details.
Usage: solc [options] [input_file...]
Compiles the given Solidity input files (or the standard input if none given or
"-" is used as a file name) and outputs the components specified in the options
at standard output or in files in the output directory, if specified.
Imports are automatically read from the filesystem, but it is also possible to
remap paths using the context:prefix=path syntax.
Example:
solc --bin -o /tmp/solcoutput dapp-bin=/usr/local/lib/dapp-bin contract.sol
General Information:
--help Show help message and exit.
--version Show version and exit.
--license Show licensing information and exit.
--input-file arg input file
Input Options:
--base-path path Use the given path as the root of the source tree
instead of the root of the filesystem.
--include-path path Make an additional source directory available to the
default import callback. Use this option if you want to
import contracts whose location is not fixed in relation
to your main source tree, e.g. third-party libraries
installed using a package manager. Can be used multiple
times. Can only be used if base path has a non-empty
value.
--allow-paths path(s)
Allow a given path for imports. A list of paths can be
supplied by separating them with a comma.
--ignore-missing Ignore missing files.
--error-recovery Enables additional parser error recovery.
Output Options:
-o [ --output-dir ] path
If given, creates one file per component and
contract/file at the specified directory.
--overwrite Overwrite existing files (used together with -o).
--evm-version version (=london)
Select desired EVM version. Either homestead,
tangerineWhistle, spuriousDragon, byzantium,
constantinople, petersburg, istanbul, berlin or london.
--experimental-via-ir
Deprecated synonym of --via-ir.
--via-ir Turn on compilation mode via the IR.
--revert-strings debug,default,strip,verboseDebug
Strip revert (and require) reason strings or add
additional debugging information.
--debug-info arg (=ast-id,location,snippet)
Debug info components to be included in the produced EVM
assembly and Yul code. Value can be all, none or a
comma-separated list containing one or more of the
following components: ast-id, location, snippet.
--stop-after stage Stop execution after the given compiler stage. Valid
options: "parsing".
Alternative Input Modes:
--standard-json Switch to Standard JSON input / output mode, ignoring
all options. It reads from standard input, if no input
file was given, otherwise it reads from the provided
input file. The result will be written to standard
output.
--link Switch to linker mode, ignoring all options apart from
--libraries and modify binaries in place.
--assemble Switch to assembly mode, ignoring all options except
--machine, --yul-dialect, --optimize and
--yul-optimizations and assumes input is assembly.
--yul Switch to Yul mode, ignoring all options except
--machine, --yul-dialect, --optimize and
--yul-optimizations and assumes input is Yul.
--strict-assembly Switch to strict assembly mode, ignoring all options
except --machine, --yul-dialect, --optimize and
--yul-optimizations and assumes input is strict
assembly.
--import-ast Import ASTs to be compiled, assumes input holds the AST
in compact JSON format. Supported Inputs is the output
of the --standard-json or the one produced by
--combined-json ast
--lsp Switch to language server mode ("LSP"). Allows the
compiler to be used as an analysis backend for your
favourite IDE.
Assembly Mode Options:
--machine evm,ewasm Target machine in assembly or Yul mode.
--yul-dialect evm,ewasm
Input dialect to use in assembly or yul mode.
Linker Mode Options:
--libraries libs Direct string or file containing library addresses.
Syntax: <libraryName>=<address> [, or whitespace] ...
Address is interpreted as a hex string prefixed by 0x.
Output Formatting:
--pretty-json Output JSON in pretty format.
--json-indent N (=2) Indent pretty-printed JSON with N spaces. Enables
'--pretty-json' automatically.
--color Force colored output.
--no-color Explicitly disable colored output, disabling terminal
auto-detection.
--error-codes Output error codes.
Output Components:
--ast-compact-json AST of all source files in a compact JSON format.
--asm EVM assembly of the contracts.
--asm-json EVM assembly of the contracts in JSON format.
--opcodes Opcodes of the contracts.
--bin Binary of the contracts in hex.
--bin-runtime Binary of the runtime part of the contracts in hex.
--abi ABI specification of the contracts.
--ir Intermediate Representation (IR) of all contracts.
--ir-optimized Optimized intermediate Representation (IR) of all
contracts.
--ewasm Ewasm text representation of all contracts
(EXPERIMENTAL).
--ewasm-ir Intermediate representation (IR) converted to a form
that can be translated directly into Ewasm text
representation (EXPERIMENTAL).
--hashes Function signature hashes of the contracts.
--userdoc Natspec user documentation of all contracts.
--devdoc Natspec developer documentation of all contracts.
--metadata Combined Metadata JSON whose Swarm hash is stored
on-chain.
--storage-layout Slots, offsets and types of the contract's state
variables.
Extra Output:
--gas Print an estimate of the maximal gas usage for each
function.
--combined-json abi,asm,ast,bin,bin-runtime,devdoc,function-debug,function-debug-runtime,generated-sources,generated-sources-runtime,hashes,metadata,opcodes,srcmap,srcmap-runtime,storage-layout,userdoc
Output a single json document containing the specified
information.
Metadata Options:
--metadata-hash ipfs,none,swarm
Choose hash method for the bytecode metadata or disable
it.
--metadata-literal Store referenced sources as literal data in the metadata
output.
Optimizer Options:
--optimize Enable bytecode optimizer.
--optimize-runs n (=200)
The number of runs specifies roughly how often each
opcode of the deployed code will be executed across the
lifetime of the contract. Lower values will optimize
more for initial deployment cost, higher values will
optimize more for high-frequency usage.
--optimize-yul Legacy option, ignored. Use the general --optimize to
enable Yul optimizer.
--no-optimize-yul Disable Yul optimizer in Solidity.
--yul-optimizations steps
Forces yul optimizer to use the specified sequence of
optimization steps instead of the built-in one.
Model Checker Options:
--model-checker-contracts default,<source>:<contract> (=default)
Select which contracts should be analyzed using the form
<source>:<contract>.Multiple pairs <source>:<contract>
can be selected at the same time, separated by a comma
and no spaces.
--model-checker-div-mod-no-slacks
Encode division and modulo operations with their precise
operators instead of multiplication with slack
variables.
--model-checker-engine all,bmc,chc,none (=none)
Select model checker engine.
--model-checker-invariants default,all,contract,reentrancy (=default)
Select whether to report inferred contract inductive
invariants. Multiple types of invariants can be selected
at the same time, separated by a comma and no spaces. By
default no invariants are reported.
--model-checker-show-unproved
Show all unproved targets separately.
--model-checker-solvers all,cvc4,z3,smtlib2 (=all)
Select model checker solvers.
--model-checker-targets default,all,constantCondition,underflow,overflow,divByZero,balance,assert,popEmptyArray,outOfBounds (=default)
Select model checker verification targets. Multiple
targets can be selected at the same time, separated by a
comma and no spaces. By default all targets except
underflow and overflow are selected.
--model-checker-timeout ms
Set model checker timeout per query in milliseconds. The
default is a deterministic resource limit. A timeout of
0 means no resource/time restrictions for any query.
Useful parameters to import third party contracts (i.e. OpenZeppelin):
--allow-paths XXXX
and--include-path XXXX
To compile the contract and get the binary code:
solc --bin contract.sol
To compile the contract and get the EVM assembly:
solc --asm contract.sol
solc --asm-json contract.sol
How to compile with imports:
solc --bin --base-path . --include-path ../node_modules -o contract.dir contract.sol