From 3e1e6a7eb9fc1bf03a92dda88b1e8d3c418fd562 Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Wed, 17 Nov 2021 09:12:23 -0500 Subject: [PATCH] Use CMake FetchContent to support both stable and HEAD ghidra (#15) Quite a few changes that should be explained in the READMEs Updates to CI actions --- .github/workflows/main.yml | 36 ++-- .gitignore | 4 + .gitmodules | 3 - CMakeLists.txt | 167 +++++------------- README.md | 49 ++--- cmake/packaging.cmake | 8 +- patches/HEAD/.gitkeep | 0 ...-arg-parsing-in-sleigh-C-test-runner.patch | 53 ++++++ patches/README.md | 12 ++ patches/stable/.gitkeep | 0 spec-files-list/spec_files_HEAD.cmake | 122 +++++++++++++ spec-files-list/spec_files_stable.cmake | 112 ++++++++++++ src | 1 - src/README.md | 107 +++++++++++ src/setup-ghidra-source.cmake | 54 ++++++ 15 files changed, 552 insertions(+), 176 deletions(-) delete mode 100644 .gitmodules create mode 100644 patches/HEAD/.gitkeep create mode 100644 patches/HEAD/0001-Fix-arg-parsing-in-sleigh-C-test-runner.patch create mode 100644 patches/README.md create mode 100644 patches/stable/.gitkeep create mode 100644 spec-files-list/spec_files_HEAD.cmake create mode 100644 spec-files-list/spec_files_stable.cmake delete mode 160000 src create mode 100644 src/README.md create mode 100644 src/setup-ghidra-source.cmake diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index cdbe32b..e6d5cff 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,28 +17,31 @@ jobs: matrix: os: [ubuntu-latest, macos-latest] build_type: [RelWithDebInfo, Debug] + release: [stable, HEAD] steps: - uses: actions/checkout@v1 + - name: Setup Git User for Applying Patches + # See this thread for more details https://github.community/t/github-actions-bot-email-address/17204/5 + run: | + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + - name: Generate cache key id: cache_key - run: echo ::set-output name=VALUE::build_${{ matrix.os }}_type-${{ matrix.build_type }} + run: echo ::set-output name=VALUE::build_${{ matrix.os }}_type-${{ matrix.build_type }}-${{ matrix.release }} - name: Update the cache (ccache) uses: actions/cache@v1.0.3 with: - path: ccache + path: "${{ github.workspace }}/ccache" key: ${{ steps.cache_key.outputs.VALUE }}_ccache - name: Create the cache - run: mkdir -p ccache - - - name: Synchronize the submodules - run: git submodule sync --recursive - - - name: Update the submodules - run: git submodule update --init --recursive + run: | + mkdir -p "${{ github.workspace }}/ccache" + echo "CCACHE_DIR=${{ github.workspace }}/ccache" >> $GITHUB_ENV - name: Install Linux system dependencies if: runner.os == 'Linux' @@ -70,23 +73,22 @@ jobs: - name: Configure the project run: | - export CCACHE_DIR="$(realpath ccache)" - cmake \ -S . \ -B build \ -G Ninja \ -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ + -DSLEIGH_GHIDRA_RELEASE_TYPE=${{ matrix.release }} \ -DSLEIGH_ENABLE_TESTS=ON \ -DSLEIGH_ENABLE_EXAMPLES=ON \ -DSLEIGH_ENABLE_PACKAGING=ON - name: Build the project run: | - export CCACHE_DIR="$(realpath ccache)" - cmake \ --build build \ -v @@ -103,12 +105,8 @@ jobs: - name: Run the install target run: | - mkdir install - export DESTDIR="$(realpath install)" - - cmake \ - --build build \ - --target install + cmake --install build \ + --prefix install - name: Create the packages run: | diff --git a/.gitignore b/.gitignore index 5acb669..173b8c9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ build .vscode + +# FetchContent Ghidra source directories +/src/ghidra* +cmake_fc_* diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index a7f8d16..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "src"] - path = src - url = https://github.com/NationalSecurityAgency/ghidra diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e9b526..3221a0a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,15 @@ # cmake_minimum_required(VERSION 3.21.0) -project("sleigh" VERSION 10.0.4.0) + +# Sets "library_root" variable for decompiler cpp root directory +# Sets "ghidra_version" for numeric version number +# Use "ghidrasource_SOURCE_DIR" variable for Ghidra repo root +include(src/setup-ghidra-source.cmake) + +project("sleigh" + VERSION "${ghidra_version}" +) include("cmake/options.cmake") @@ -23,12 +31,6 @@ if(SLEIGH_ENABLE_PACKAGING) endif() endif() -# Make sure the submodule has been initialized correctly -set(library_root "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Features/Decompiler/src/decompile/cpp") -if(NOT EXISTS "${library_root}/sleigh.hh") - message(FATAL_ERROR "The ghidra submodule has not been initialized") -endif() - set(sleigh_core_source_list "${library_root}/xml.cc" "${library_root}/space.cc" @@ -222,6 +224,11 @@ add_executable(decomp_opt "${library_root}/consolemain.cc" ) +if("${SLEIGH_GHIDRA_RELEASE_TYPE}" STREQUAL "HEAD") + target_sources(decomp_opt PRIVATE + "${library_root}/testfunction.cc" + ) +endif() target_compile_definitions(decomp_opt PRIVATE __TERMINAL__ @@ -255,6 +262,12 @@ if(SLEIGH_ENABLE_TESTS) "${library_root}/test.cc" "${library_root}/../unittests/testfloatemu.cc" ) + if("${SLEIGH_GHIDRA_RELEASE_TYPE}" STREQUAL "HEAD") + target_sources(ghidra_test_dbg PRIVATE + "${library_root}/../unittests/testtypes.cc" + "${library_root}/../unittests/testcirclerange.cc" + ) + endif() target_link_libraries(ghidra_test_dbg PRIVATE sleigh_settings @@ -268,9 +281,14 @@ if(SLEIGH_ENABLE_TESTS) "${library_root}" ) + set(extra_test_args "") + if("${SLEIGH_GHIDRA_RELEASE_TYPE}" STREQUAL "HEAD") + # We compile the sla files in our build directory + set(extra_test_args -sleighpath "${CMAKE_CURRENT_BINARY_DIR}") + endif() add_test( NAME ghidra_test_dbg - COMMAND ghidra_test_dbg + COMMAND ghidra_test_dbg ${extra_test_args} unittests ) endif() @@ -283,6 +301,13 @@ add_executable(ghidra_opt ${sleigh_deccore_source_list} ${sleigh_ghidra_source_list} ) +if("${SLEIGH_GHIDRA_RELEASE_TYPE}" STREQUAL "HEAD") + target_sources(ghidra_opt PRIVATE + $<$: + "${library_root}/testfunction.cc" + > + ) +endif() target_link_libraries(ghidra_opt PRIVATE sleigh_settings @@ -424,127 +449,19 @@ endif() # # Spec files # +if(NOT "${SLEIGH_GHIDRA_RELEASE_TYPE}" STREQUAL "HEAD") + include(spec-files-list/spec_files_stable.cmake) +else() + include(spec-files-list/spec_files_HEAD.cmake) +endif() -set(spec_file_list - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/6502/data/languages/6502.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/68000/data/languages/68020.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/68000/data/languages/68030.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/68000/data/languages/68040.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/68000/data/languages/coldfire.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/6805/data/languages/6805.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/6805/data/languages/6809.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/8048/data/languages/8048.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/8051/data/languages/80251.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/8051/data/languages/80390.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/8051/data/languages/8051.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/8051/data/languages/mx51.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/8085/data/languages/8085.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/AARCH64/data/languages/AARCH64BE.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/AARCH64/data/languages/AARCH64.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM4_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM4_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM4t_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM4t_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM5_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM5_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM5t_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM5t_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM6_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM6_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM7_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM7_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM8_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/ARM/data/languages/ARM8_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Atmel/data/languages/avr32a.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Atmel/data/languages/avr8eind.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Atmel/data/languages/avr8e.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Atmel/data/languages/avr8.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Atmel/data/languages/avr8xmega.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/CP1600/data/languages/CP1600.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/CR16/data/languages/CR16B.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/CR16/data/languages/CR16C.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Dalvik/data/languages/Dalvik.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/DATA/data/languages/data-be-64.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/DATA/data/languages/data-le-64.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/HCS08/data/languages/HC05.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/HCS08/data/languages/HC08.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/HCS08/data/languages/HCS08.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/HCS12/data/languages/HCS12.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/JVM/data/languages/JVM.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/M8C/data/languages/m8c.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/MCS96/data/languages/MCS96.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/MIPS/data/languages/mips32be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/MIPS/data/languages/mips32le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/MIPS/data/languages/mips32R6be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/MIPS/data/languages/mips32R6le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/MIPS/data/languages/mips64be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/MIPS/data/languages/mips64le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PA-RISC/data/languages/pa-risc32be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PIC/data/languages/dsPIC30F.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PIC/data/languages/dsPIC33C.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PIC/data/languages/dsPIC33E.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PIC/data/languages/dsPIC33F.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PIC/data/languages/pic12c5xx.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PIC/data/languages/pic16c5x.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PIC/data/languages/pic16f.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PIC/data/languages/pic16.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PIC/data/languages/pic17c7xx.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PIC/data/languages/pic18.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PIC/data/languages/PIC24E.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PIC/data/languages/PIC24F.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PIC/data/languages/PIC24H.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_32_4xx_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_32_4xx_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_32_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_32_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_32_quicciii_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_32_quicciii_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_64_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_altivec_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_altivec_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_altivec_vle_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_vle_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/PowerPC/data/languages/ppc_64_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/RISCV/data/languages/riscv.ilp32d.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/RISCV/data/languages/riscv.lp64d.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Sparc/data/languages/SparcV9_32.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Sparc/data/languages/SparcV9_64.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/SuperH4/data/languages/SuperH4_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/SuperH4/data/languages/SuperH4_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/SuperH/data/languages/sh-1.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/SuperH/data/languages/sh-2a.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/SuperH/data/languages/sh-2.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/TI_MSP430/data/languages/TI_MSP430.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/TI_MSP430/data/languages/TI_MSP430X.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Toy/data/languages/toy64_be_harvard.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Toy/data/languages/toy64_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Toy/data/languages/toy64_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Toy/data/languages/toy_be_posStack.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Toy/data/languages/toy_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Toy/data/languages/toy_builder_be_align2.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Toy/data/languages/toy_builder_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Toy/data/languages/toy_builder_le_align2.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Toy/data/languages/toy_builder_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Toy/data/languages/toy_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Toy/data/languages/toy_wsz_be.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Toy/data/languages/toy_wsz_le.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/tricore/data/languages/tricore.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/V850/data/languages/V850.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/x86/data/languages/x86-64.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/x86/data/languages/x86.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Z80/data/languages/z180.slaspec" - "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors/Z80/data/languages/z80.slaspec" -) - -set(sla_spec_output "${CMAKE_CURRENT_BINARY_DIR}/Processors") +set(sla_spec_output "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors") add_custom_command( OUTPUT "${sla_spec_output}" DEPENDS ${spec_file_list} COMMAND "${CMAKE_COMMAND}" -E rm -rf "${sla_spec_output}" - COMMAND "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/src/Ghidra/Processors" "${sla_spec_output}" + COMMAND "${CMAKE_COMMAND}" -E copy_directory "${ghidrasource_SOURCE_DIR}/Ghidra/Processors" "${sla_spec_output}" COMMENT "sleigh: Copying the spec files" VERBATIM ) @@ -588,7 +505,7 @@ if(SLEIGH_ENABLE_EXAMPLES) add_custom_target(sleighexample_runner "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/specfiles" - COMMAND "${CMAKE_COMMAND}" -E create_symlink "${CMAKE_CURRENT_BINARY_DIR}/Processors/x86/data/languages/x86.sla" "${CMAKE_CURRENT_BINARY_DIR}/specfiles/x86.sla" + COMMAND "${CMAKE_COMMAND}" -E create_symlink "${CMAKE_CURRENT_BINARY_DIR}/Ghidra/Processors/x86/data/languages/x86.sla" "${CMAKE_CURRENT_BINARY_DIR}/specfiles/x86.sla" COMMAND sleighexample disassemble WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" ) @@ -696,7 +613,7 @@ if(SLEIGH_ENABLE_INSTALL) "${library_root}/translate.hh" "${library_root}/types.h" "${library_root}/xml.hh" - "${CMAKE_CURRENT_SOURCE_DIR}/include/libsleigh.hh" + "${PROJECT_SOURCE_DIR}/include/libsleigh.hh" ) install( diff --git a/README.md b/README.md index f45cd09..80aff65 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,21 @@ This repository provides a CMake-based build project for SLEIGH so that it can b ## Dependencies and Prerequisites +### Required + | Name | Version | Linux Package to Install | macOS Homebrew Package to Install | | ---- | ------- | ------------------------ | --------------------------------- | | [Git](https://git-scm.com/) | Latest | git | N/A | -| [Ninja](https://ninja-build.org/) | Latest | ninja-build | ninja | | [CMake](https://cmake.org/) | 3.21+ | cmake | cmake | + +**NOTE**: This CMake project pulls the Ghidra source code from the internet during configuration. See the [note on Ghidra source code section](#note-on-ghidra-source-code) for more details. + +### Optional + +For building documentation during installation and packaging: + +| Name | Version | Linux Package to Install | macOS Homebrew Package to Install | +| ---- | ------- | ------------------------ | --------------------------------- | | [Doxygen](https://www.doxygen.nl/) | Latest | doxygen | doxygen | | [GraphViz](https://graphviz.org/) | Latest | graphviz | graphviz | @@ -29,27 +39,23 @@ This repository provides a CMake-based build project for SLEIGH so that it can b git clone https://github.com/lifting-bits/sleigh.git cd sleigh -# Update the GHIDRA submodule -git submodule update --init --recursive --progress - -# Create a build directory -mkdir build -cd build - # Configure CMake -cmake \ - -DSLEIGH_ENABLE_INSTALL=ON \ - -DCMAKE_INSTALL_PREFIX="" \ - -G Ninja \ - .. +cmake -B build -S . \ + -DSLEIGH_ENABLE_INSTALL=ON # Build SLEIGH -cmake --build . +cmake --build build -j # Install SLEIGH -cmake --build . --target install +cmake --install build --prefix ``` +### Note on Ghidra source code + +The Ghidra source code is not actually included in this git repo, and by default, CMake will automatically pull a stable version from the internet for you. + +Please see [`src/README.md`](./src/README.md) for more information on how to customize which Ghidra source code commit will be used/compiled, including specifying your own local copy of the Ghidra source. + ## Packaging The CMake configuration also supports building packages for SLEIGH. If the `SLEIGH_ENABLE_PACKAGING` option is set during the configuration step, the build step will generate a tarball containing the SLEIGH installation. Additionally, the build will create an RPM package if it finds `rpm` in the `PATH` and/or a DEB package if it finds `dpkg` in the `PATH`. @@ -57,17 +63,14 @@ The CMake configuration also supports building packages for SLEIGH. If the `SLEI For example: ```sh -cmake \ - -DSLEIGH_ENABLE_PACKAGING=ON \ - -DCMAKE_INSTALL_PREFIX="" \ - -G Ninja \ - .. +cmake -B build -S . \ + -DSLEIGH_ENABLE_PACKAGING=ON # Build SLEIGH -cmake --build . +cmake --build build -j # Package SLEIGH -cmake --build . --target package +cmake --build build --target package ``` ## API Usage @@ -100,7 +103,7 @@ $ sleigh-lift pcode /share/sleigh/Processors/x86 (register,0x202,1) = INT_EQUAL (unique,0x12d00,1) (const,0x0,1) ``` -The `SLEIGH_ENABLE_EXAMPLES` option must be set during the configuration step in order to build `sleigh-lift`. +The `SLEIGH_ENABLE_EXAMPLES` option must be set to `ON` during the configuration step in order to build `sleigh-lift`. ## License diff --git a/cmake/packaging.cmake b/cmake/packaging.cmake index d066aab..7adebcc 100644 --- a/cmake/packaging.cmake +++ b/cmake/packaging.cmake @@ -7,11 +7,9 @@ # set(PACKAGE_VERSION 1) - -string(REPLACE "." ";" SLEIGH_VERSION_COMPONENTS "${PROJECT_VERSION}") -list(GET SLEIGH_VERSION_COMPONENTS 0 CPACK_PACKAGE_VERSION_MAJOR) -list(GET SLEIGH_VERSION_COMPONENTS 1 CPACK_PACKAGE_VERSION_MINOR) -list(GET SLEIGH_VERSION_COMPONENTS 2 CPACK_PACKAGE_VERSION_PATCH) +if("${SLEIGH_GHIDRA_RELEASE_TYPE}" STREQUAL "HEAD") + set(PACKAGE_VERSION "DEV.${ghidra_short_commit}") +endif() set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "SLEIGH was designed for the GHIDRA reverse engineering platform and is used to describe microprocessors with enough detail to facilitate two major components of GHIDRA, the disassembly and decompilation engines.") set(CPACK_PACKAGE_NAME "sleigh") diff --git a/patches/HEAD/.gitkeep b/patches/HEAD/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/patches/HEAD/0001-Fix-arg-parsing-in-sleigh-C-test-runner.patch b/patches/HEAD/0001-Fix-arg-parsing-in-sleigh-C-test-runner.patch new file mode 100644 index 0000000..49b81a3 --- /dev/null +++ b/patches/HEAD/0001-Fix-arg-parsing-in-sleigh-C-test-runner.patch @@ -0,0 +1,53 @@ +From d0b7efa848938b880332a729629c31a724dbf855 Mon Sep 17 00:00:00 2001 +From: Eric Kilmer +Date: Mon, 1 Nov 2021 17:10:18 -0400 +Subject: [PATCH] Fix arg parsing in sleigh C++ test runner + +--- + Ghidra/Features/Decompiler/src/decompile/cpp/test.cc | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/test.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/test.cc +index e81f2564a..7c5557158 100644 +--- a/Ghidra/Features/Decompiler/src/decompile/cpp/test.cc ++++ b/Ghidra/Features/Decompiler/src/decompile/cpp/test.cc +@@ -85,7 +85,7 @@ int main(int argc, char **argv) { + set dataTestNames; + string dirname("../datatests"); + string sleighdirname("../../../../../../.."); +- if (argc > 0) { ++ while (argc > 0) { + string command(argv[0]); + if (command == "-path") { + dirname = argv[1]; +@@ -109,21 +109,23 @@ int main(int argc, char **argv) { + argv += 1; + argc -= 1; + } +- } +- if (argc > 0) { +- string command(argv[0]); +- if (command == "unittests") { ++ else if (command == "unittests") { + runUnitTests = true; + runDataTests = false; // Run only unit tests + unitTestNames.insert(argv + 1,argv + argc); ++ argv += 1; ++ argc -=1; + } + else if (command == "datatests") { + runUnitTests = false; // Run only data-tests + runDataTests = true; + dataTestNames.insert(argv + 1,argv + argc); ++ argv += 1; ++ argc -=1; + } + else { + cout << "USAGE: ghidra_test [-path ] [[unittests|datatests] [testname1 testname2 ...]]" << endl; ++ return -1; + } + } + startDecompilerLibrary(sleighdirname.c_str()); +-- +2.33.1 + diff --git a/patches/README.md b/patches/README.md new file mode 100644 index 0000000..70d3c47 --- /dev/null +++ b/patches/README.md @@ -0,0 +1,12 @@ +# Ghidra Patches + +This directory contains small patches that should not affect any deployed Ghidra sleigh functionality from its original intent. + +These patches primarily support packaging and testing, or fixing critical issues that prevent building for one reason or another. + +The two directories are detailed below: + +* [`stable`](./stable) --- Patches applied to the officially released _stable_ version of Ghidra. +* [`HEAD`](./HEAD) --- Patches applied to Ghidra's newer _HEAD_ commit (as listed in [`../src/setup-ghidra-source.cmake`](../src/setup-ghidra-source.cmake) file). + +See the [`../src/README.md`](../src/README.md) for more details on how these patches are used/applied. diff --git a/patches/stable/.gitkeep b/patches/stable/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/spec-files-list/spec_files_HEAD.cmake b/spec-files-list/spec_files_HEAD.cmake new file mode 100644 index 0000000..04d36a2 --- /dev/null +++ b/spec-files-list/spec_files_HEAD.cmake @@ -0,0 +1,122 @@ +set(spec_file_list + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/6502/data/languages/6502.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/6502/data/languages/65c02.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/68000/data/languages/68020.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/68000/data/languages/68030.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/68000/data/languages/68040.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/68000/data/languages/coldfire.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/6805/data/languages/6805.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/6805/data/languages/6809.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/8048/data/languages/8048.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/8051/data/languages/80251.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/8051/data/languages/80390.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/8051/data/languages/8051.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/8051/data/languages/mx51.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/8085/data/languages/8085.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/AARCH64/data/languages/AARCH64.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/AARCH64/data/languages/AARCH64BE.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM4_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM4_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM4t_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM4t_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM5_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM5_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM5t_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM5t_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM6_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM6_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM7_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM7_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM8_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM8_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Atmel/data/languages/avr32a.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Atmel/data/languages/avr8.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Atmel/data/languages/avr8e.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Atmel/data/languages/avr8eind.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Atmel/data/languages/avr8xmega.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/CP1600/data/languages/CP1600.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/CR16/data/languages/CR16B.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/CR16/data/languages/CR16C.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/DATA/data/languages/data-be-64.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/DATA/data/languages/data-le-64.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Dalvik/data/languages/Dalvik_Base.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Dalvik/data/languages/Dalvik_DEX_Android10.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Dalvik/data/languages/Dalvik_DEX_Android11.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Dalvik/data/languages/Dalvik_DEX_KitKat.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Dalvik/data/languages/Dalvik_DEX_Lollipop.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Dalvik/data/languages/Dalvik_DEX_Marshmallow.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Dalvik/data/languages/Dalvik_DEX_Nougat.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Dalvik/data/languages/Dalvik_DEX_Oreo.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Dalvik/data/languages/Dalvik_DEX_Pie.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Dalvik/data/languages/Dalvik_ODEX_KitKat.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/HCS08/data/languages/HC05.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/HCS08/data/languages/HC08.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/HCS08/data/languages/HCS08.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/HCS12/data/languages/HCS12.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/JVM/data/languages/JVM.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/M8C/data/languages/m8c.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MCS96/data/languages/MCS96.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MIPS/data/languages/mips32R6be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MIPS/data/languages/mips32R6le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MIPS/data/languages/mips32be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MIPS/data/languages/mips32le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MIPS/data/languages/mips64be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MIPS/data/languages/mips64le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PA-RISC/data/languages/pa-risc32be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/PIC24E.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/PIC24F.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/PIC24H.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/dsPIC30F.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/dsPIC33C.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/dsPIC33E.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/dsPIC33F.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/pic12c5xx.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/pic16.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/pic16c5x.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/pic16f.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/pic17c7xx.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/pic18.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_4xx_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_4xx_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_quicciii_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_quicciii_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_altivec_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_altivec_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_altivec_vle_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_vle_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/RISCV/data/languages/riscv.ilp32d.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/RISCV/data/languages/riscv.lp64d.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Sparc/data/languages/SparcV9_32.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Sparc/data/languages/SparcV9_64.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/SuperH/data/languages/sh-1.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/SuperH/data/languages/sh-2.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/SuperH/data/languages/sh-2a.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/SuperH4/data/languages/SuperH4_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/SuperH4/data/languages/SuperH4_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/TI_MSP430/data/languages/TI_MSP430.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/TI_MSP430/data/languages/TI_MSP430X.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy64_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy64_be_harvard.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy64_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_be_posStack.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_builder_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_builder_be_align2.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_builder_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_builder_le_align2.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_wsz_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_wsz_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/V850/data/languages/V850.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Z80/data/languages/z180.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Z80/data/languages/z80.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/tricore/data/languages/tricore.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/x86/data/languages/x86-64.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/x86/data/languages/x86.slaspec" +) diff --git a/spec-files-list/spec_files_stable.cmake b/spec-files-list/spec_files_stable.cmake new file mode 100644 index 0000000..04201e9 --- /dev/null +++ b/spec-files-list/spec_files_stable.cmake @@ -0,0 +1,112 @@ +set(spec_file_list + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/6502/data/languages/6502.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/68000/data/languages/68020.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/68000/data/languages/68030.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/68000/data/languages/68040.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/68000/data/languages/coldfire.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/6805/data/languages/6805.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/6805/data/languages/6809.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/8048/data/languages/8048.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/8051/data/languages/80251.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/8051/data/languages/80390.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/8051/data/languages/8051.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/8051/data/languages/mx51.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/8085/data/languages/8085.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/AARCH64/data/languages/AARCH64.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/AARCH64/data/languages/AARCH64BE.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM4_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM4_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM4t_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM4t_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM5_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM5_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM5t_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM5t_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM6_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM6_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM7_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM7_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM8_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/ARM/data/languages/ARM8_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Atmel/data/languages/avr32a.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Atmel/data/languages/avr8.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Atmel/data/languages/avr8e.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Atmel/data/languages/avr8eind.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Atmel/data/languages/avr8xmega.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/CP1600/data/languages/CP1600.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/CR16/data/languages/CR16B.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/CR16/data/languages/CR16C.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/DATA/data/languages/data-be-64.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/DATA/data/languages/data-le-64.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Dalvik/data/languages/Dalvik.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/HCS08/data/languages/HC05.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/HCS08/data/languages/HC08.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/HCS08/data/languages/HCS08.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/HCS12/data/languages/HCS12.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/JVM/data/languages/JVM.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/M8C/data/languages/m8c.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MCS96/data/languages/MCS96.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MIPS/data/languages/mips32R6be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MIPS/data/languages/mips32R6le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MIPS/data/languages/mips32be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MIPS/data/languages/mips32le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MIPS/data/languages/mips64be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/MIPS/data/languages/mips64le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PA-RISC/data/languages/pa-risc32be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/PIC24E.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/PIC24F.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/PIC24H.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/dsPIC30F.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/dsPIC33C.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/dsPIC33E.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/dsPIC33F.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/pic12c5xx.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/pic16.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/pic16c5x.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/pic16f.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/pic17c7xx.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PIC/data/languages/pic18.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_4xx_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_4xx_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_quicciii_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_quicciii_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_altivec_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_altivec_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_altivec_vle_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_isa_vle_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_64_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/RISCV/data/languages/riscv.ilp32d.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/RISCV/data/languages/riscv.lp64d.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Sparc/data/languages/SparcV9_32.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Sparc/data/languages/SparcV9_64.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/SuperH/data/languages/sh-1.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/SuperH/data/languages/sh-2.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/SuperH/data/languages/sh-2a.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/SuperH4/data/languages/SuperH4_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/SuperH4/data/languages/SuperH4_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/TI_MSP430/data/languages/TI_MSP430.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/TI_MSP430/data/languages/TI_MSP430X.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy64_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy64_be_harvard.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy64_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_be_posStack.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_builder_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_builder_be_align2.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_builder_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_builder_le_align2.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_wsz_be.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Toy/data/languages/toy_wsz_le.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/V850/data/languages/V850.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Z80/data/languages/z180.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/Z80/data/languages/z80.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/tricore/data/languages/tricore.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/x86/data/languages/x86-64.slaspec" + "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/x86/data/languages/x86.slaspec" +) diff --git a/src b/src deleted file mode 160000 index 5b07797..0000000 --- a/src +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5b07797cb859d8801ca3a1e08bda1321ca3ce002 diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..4833d23 --- /dev/null +++ b/src/README.md @@ -0,0 +1,107 @@ +# Ghidra Source code + +This project uses CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module to set up the Ghidra source tree. This means we can apply [patches](../patches) that live only in this repo for small changes to features like packaging or running tests. + +By default, CMake pulls a stable version of Ghidra. You may use a more recent commit by specifying `-DSLEIGH_GHIDRA_RELEASE_TYPE=HEAD` during CMake configuration. + +See the `SLEIGH_GHIDRA_*` CMake cache variable comments for more details on how to customize your Ghidra source checkout. + +## Advanced Usage Notes + +Always reference the [CMake Documentation](https://cmake.org/cmake/help/latest/) for explanation of features and cache variable usages/effects. + +### Using your own Ghidra checkout + +This method is useful for developing new features on top of the latest commits in Ghidra's default branch. If the commit(s) at the tip of Ghidra's default branch are not supported by this repo, we welcome pull requests to update support and pin that commit. + +**Arbitrary Ghidra checkouts are not officially supported.** + +If you want to use your own Ghidra source checkout, then set the following during CMake configuration: + +* `-DSLEIGH_GHIDRA_RELEASE_TYPE=HEAD` if using commits on Ghidra's default branch (`master`) or any branch that may be incompatible with the current stable version. + +* `-DFETCHCONTENT_SOURCE_DIR_GHIDRASOURCE=`. Remember, no existing [patches](../patches/HEAD) will be applied to your own source directory. + +```bash +git clone https://github.com/NationalSecurityAgency/ghidra src/ghidra + +cmake -B build-dev-head -S . \ + -DSLEIGH_GHIDRA_RELEASE_TYPE=HEAD \ + -DFETCHCONTENT_SOURCE_DIR_GHIDRASOURCE="$(pwd)/src/ghidra" +``` + +### Reusing Downloaded Ghidra Source + +If you want to share a single Ghidra source checkout/clone for multiple build directories, the [_FetchContent Base Directory_](https://cmake.org/cmake/help/latest/module/FetchContent.html#variable:FETCHCONTENT_BASE_DIR) (`FETCHCONTENT_BASE_DIR`) should encode the build generator name and be located outside of the build directory (the name would look something like `cmake_fc_ghidra_${SLEIGH_GHIDRA_RELEASE_TYPE}_${CMAKE_GENERATOR}`). + +Initially, this means that every new build generator used for building the project will have to re-download the ghidra source tree, but any subsequent run with an already-initialize generator should be faster and skip the download. + +```bash +$ cmake -B build-release -S . -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DFETCHCONTENT_BASE_DIR=./src/cmake_fc_ghidra_stable_Ninja +-- Using Ghidra version 10.0.4 at commit 5b07797 +-- Populating ghidrasource +-- Configuring done +-- Generating done +-- Build files have been written to: /Users/me/sleigh/src/cmake_fc_ghidra_stable_Ninja/ghidrasource-subbuild +[1/9] Creating directories for 'ghidrasource-populate' +[1/9] Performing download step (git clone) for 'ghidrasource-populate' +Cloning into 'ghidrasource-src'... +remote: Enumerating objects: 129964, done. +remote: Counting objects: 100% (4238/4238), done. +remote: Compressing objects: 100% (1889/1889), done. +remote: Total 129964 (delta 2078), reused 3993 (delta 2038), pack-reused 125726 +Receiving objects: 100% (129964/129964), 172.50 MiB | 15.10 MiB/s, done. +Resolving deltas: 100% (79637/79637), done. +HEAD is now at 5b07797cb Updated 10.0.4 Change History +[2/9] Performing update step for 'ghidrasource-populate' +[4/9] No patch step for 'ghidrasource-populate' +[5/9] No configure step for 'ghidrasource-populate' +[6/9] No build step for 'ghidrasource-populate' +[7/9] No install step for 'ghidrasource-populate' +[8/9] No test step for 'ghidrasource-populate' +[9/9] Completed 'ghidrasource-populate' +-- Ghidra source located at '/Users/me/sleigh/src/cmake_fc_ghidra_stable_Ninja/ghidrasource-src' +-- The C compiler identification is AppleClang 13.0.0.13000029 +-- The CXX compiler identification is AppleClang 13.0.0.13000029 +... + +$ cmake -B build-debug -S . -G Ninja \ + -DCMAKE_BUILD_TYPE=Debug \ + -DFETCHCONTENT_BASE_DIR=./src/cmake_fc_ghidra_stable_Ninja +-- Using Ghidra version 10.0.4 at commit 5b07797 +-- Populating ghidrasource +-- Configuring done +-- Generating done +-- Build files have been written to: /Users/me/sleigh/src/cmake_fc_ghidra_stable_Ninja/ghidrasource-subbuild +[0/7] Performing update step for 'ghidrasource-populate' +[2/7] No patch step for 'ghidrasource-populate' +[3/7] No configure step for 'ghidrasource-populate' +[4/7] No build step for 'ghidrasource-populate' +[5/7] No install step for 'ghidrasource-populate' +[6/7] No test step for 'ghidrasource-populate' +[7/7] Completed 'ghidrasource-populate' +-- Ghidra source located at '/Users/me/sleigh/src/cmake_fc_ghidra_stable_Ninja/ghidrasource-src' +-- The C compiler identification is AppleClang 13.0.0.13000029 +-- The CXX compiler identification is AppleClang 13.0.0.13000029 +... +``` + +The above also works when using `HEAD` commit of Ghidra. + +```bash +$ cmake -B build-head-release -S . -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DSLEIGH_GHIDRA_RELEASE_TYPE=HEAD \ + -DFETCHCONTENT_BASE_DIR=./src/cmake_fc_ghidra_HEAD_Ninja +... + +$ cmake -B build-head-debug -S . -G Ninja \ + -DCMAKE_BUILD_TYPE=Debug \ + -DSLEIGH_GHIDRA_RELEASE_TYPE=HEAD \ + -DFETCHCONTENT_BASE_DIR=./src/cmake_fc_ghidra_HEAD_Ninja +... +``` + +This setup is nice if you want to clear the project build directories but don't want to re-download Ghidra source code every time. However, to be safe, you should remove these directories if you change the Ghidra git commit SHA of stable or HEAD. diff --git a/src/setup-ghidra-source.cmake b/src/setup-ghidra-source.cmake new file mode 100644 index 0000000..a72f9f1 --- /dev/null +++ b/src/setup-ghidra-source.cmake @@ -0,0 +1,54 @@ +# ---- Setup Ghidra Source code ---- + +# Set up Ghidra repo human-readable version settings +set(SLEIGH_GHIDRA_RELEASE_TYPE "stable" CACHE + STRING "Ghidra release type to use. 'HEAD' is used for active development purposes." +) +# This is just helper for CMake UIs. CMake does not enforce that the value matches one of those listed. +set_property(CACHE SLEIGH_GHIDRA_RELEASE_TYPE PROPERTY STRINGS "stable" "HEAD") + +# **** Setup pinned git info **** + +# Ghidra pinned stable version commit +set(ghidra_version "10.0.4") +set(ghidra_git_tag "5b07797cb859d8801ca3a1e08bda1321ca3ce002") +# pinned stable patches list +set(ghidra_patches "") + +# Ghidra pinned commits used for pinning last known working HEAD commit +if("${SLEIGH_GHIDRA_RELEASE_TYPE}" STREQUAL HEAD) + # TODO: Try to remember to look at Ghidra/application.properties + # TODO: CMake only likes numeric characters in the version string.... + set(ghidra_version "10.1") + set(ghidra_git_tag "55b8fcf7d4aeaca37ffb5c947340915d69c84224") + set(ghidra_patches + PATCH_COMMAND git am --ignore-space-change --ignore-whitespace --no-gpg-sign + "${CMAKE_CURRENT_SOURCE_DIR}/patches/HEAD/0001-Fix-arg-parsing-in-sleigh-C-test-runner.patch" + ) +endif() + +string(SUBSTRING "${ghidra_git_tag}" 0 7 ghidra_short_commit) + +message(STATUS "Using Ghidra version ${ghidra_version} at commit ${ghidra_short_commit}") + +include(FetchContent) + +# Verbose fetch content updates +set(FETCHCONTENT_QUIET OFF) + +# Write out source directory with identifiable version info +FetchContent_Declare(GhidraSource + GIT_REPOSITORY https://github.com/NationalSecurityAgency/ghidra + GIT_TAG ${ghidra_git_tag} + GIT_PROGRESS TRUE + ${ghidra_patches} +) +FetchContent_MakeAvailable(GhidraSource) + +message(STATUS "Ghidra source located at '${ghidrasource_SOURCE_DIR}'") + +# Sanity check on Ghidra source code checkout +set(library_root "${ghidrasource_SOURCE_DIR}/Ghidra/Features/Decompiler/src/decompile/cpp") +if(NOT EXISTS "${library_root}/sleigh.hh") + message(FATAL_ERROR "The Ghidra source directory has not been initialized correctly. Could not find '${library_root}'") +endif()