Skip to content

Commit d6e02e5

Browse files
committed
remill
1 parent 77d2ff6 commit d6e02e5

File tree

4 files changed

+187
-66
lines changed

4 files changed

+187
-66
lines changed

lib.nix

+12
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,16 @@ final: prev:
5656
echo ${final.lib.escapeShellArgs [text]} >> $py
5757
fi
5858
'';
59+
60+
61+
git-am-shim = final.writeShellScript "git-am-shim"
62+
''
63+
echo $0 "$@"
64+
set -e
65+
for f in "$@"; do
66+
if [[ "$f" == *.patch ]]; then
67+
( set -x ; cat $f | patch -p1 )
68+
fi
69+
done
70+
'';
5971
}

llvm-translator/remill.nix

+119-66
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,148 @@
1-
{ stdenv
2-
, fetchzip
3-
, fetchurl
1+
{ lib
2+
, stdenv
43
, fetchFromGitHub
5-
, symlinkJoin
64
, python3
7-
, bash
85
, cmake
96
, ninja
10-
, git
11-
,
7+
, llvmPackages
8+
, xed
9+
, glog
10+
, gtest
11+
, sleigh
12+
, breakpointHook
13+
, git-am-shim
14+
, abseil-cpp
1215
}:
13-
16+
with llvmPackages;
1417
let
15-
cxx-common = fetchzip {
16-
url = "https://github.com/lifting-bits/cxx-common/releases/download/v0.2.7/vcpkg_ubuntu-20.04_llvm-14_amd64.tar.xz";
17-
hash = "sha256-FTw/GFLasAM5rKvgbltLNwJ8464x2O5I2TZMtuMSrVo=";
18-
};
18+
clang = llvmPackages.libcxxClang;
19+
# cxx-all = fetchurl {
20+
# url = "https://github.com/lifting-bits/cxx-common/releases/download/v0.6.4/vcpkg_ubuntu-22.04_llvm-16_amd64.tar.xz";
21+
# hash = "sha256-RiGiHgU4XfC9hZ/bVbBBEHTztSU6OOUAz6VZBXIVpxg=";
22+
# };
23+
24+
# cxx-common = runCommand "cxx-common-reduced" {}
25+
# ''
26+
# mkdir $out
27+
# cd $out
28+
# XZ_OPT='-T0' tar xf ${cxx-all} --strip-components=1
29+
# rm -rf installed/*/{tools,share,include}/{llvm,clang,mlir} installed/*/lib/lib{clang,LLVM,MLIR,mlir,LTO}*
30+
# '';
31+
32+
cxx-common = fetchFromGitHub {
33+
owner = "lifting-bits";
34+
repo = "cxx-common";
35+
rev = "v0.6.4";
36+
hash = "";
1937

20-
ghidra = fetchFromGitHub {
21-
owner = "NationalSecurityAgency";
22-
repo = "ghidra";
23-
rev = "Ghidra_10.1.4_build";
24-
leaveDotGit = true;
25-
hash = "sha256-8W2uK7F/B8a2MALtGIq1/QiTJeynDod5xHpR4qU6p9g=";
38+
postFetch = ''
39+
substituteInPlace ports/xed/XEDConfig.cmake \
40+
--replace "''${ROOT}" '${xed}'
41+
'';
2642
};
2743

28-
sleigh = fetchFromGitHub {
44+
remill-src = fetchFromGitHub {
2945
owner = "lifting-bits";
30-
repo = "sleigh";
31-
rev = "5ee2f2c16250a6529108e6a6fff89e0f147502d2";
32-
leaveDotGit = true;
33-
hash = "sha256-4p2G6kQxvkjRtWxYCaWytHhQ+UsOIeG55a4TAkEZsek=";
46+
repo = "remill";
47+
rev = "391261923a036196ad9dd2c8213c0193ad727cd9";
48+
hash = "sha256-DiskkPngmnq4adR5ew2h1vFvD7y3MWdoo0AcNv+OaAU=";
3449
};
3550

36-
sleigh2 = symlinkJoin {
37-
name = "sleigh";
38-
paths = [ sleigh ];
39-
postBuild = ''
40-
CMAKE=$out/src/setup-ghidra-source.cmake
41-
cp --remove-destination -v $(readlink $CMAKE) $CMAKE
42-
# substituteInPlace $CMAKE \
43-
# --replace 'GIT_REPOSITORY https://github.com/NationalSecurityAgency/ghidra' "SOURCE_DIR ${ghidra}"
44-
'';
51+
sleigh' = sleigh.overrideAttrs {
52+
sleigh_ADDITIONAL_PATCHES = [
53+
"${remill-src}/patches/sleigh/0001-AARCH64base.patch"
54+
"${remill-src}/patches/sleigh/0001-AARCH64instructions.patch"
55+
"${remill-src}/patches/sleigh/0001-ARM.patch"
56+
"${remill-src}/patches/sleigh/0001-ARMTHUMBinstructions.patch"
57+
"${remill-src}/patches/sleigh/0001-ppc_common.patch"
58+
"${remill-src}/patches/sleigh/0001-ppc_instructions.patch"
59+
"${remill-src}/patches/sleigh/0001-ppc_isa.patch"
60+
"${remill-src}/patches/sleigh/0001-ppc_vle.patch"
61+
"${remill-src}/patches/sleigh/0001-quicciii.patch"
62+
"${remill-src}/patches/sleigh/x86-ia.patch"
63+
];
4564
};
4665

66+
ghidra-fork = fetchFromGitHub {
67+
owner = "trail-of-forks";
68+
repo = "ghidra";
69+
rev = "e7196d8b943519d3aa5eace6a988cda3aa6aca5c";
70+
hash = "sha256-uOaTY9dYVAyu5eU2tLKNJWRwN98OQkCVynwQvjeBQB8=";
71+
};
4772
in
48-
stdenv.mkDerivation rec {
73+
stdenv.mkDerivation (self: {
4974
pname = "remill";
50-
version = "v5.0.7";
75+
version = "unstable";
5176

52-
src = fetchFromGitHub {
53-
owner = "lifting-bits";
54-
repo = "remill";
55-
rev = "v5.0.7";
56-
hash = "sha256-oOEw+V5fmCoNhB9a1Y+US3Ff0M50jb9qhBKsXyUwqY4=";
57-
leaveDotGit = true;
58-
};
77+
src = remill-src;
78+
79+
nativeBuildInputs = [ python3 cmake clang breakpointHook ];
80+
buildInputs = [ sleigh' llvm xed glog gtest abseil-cpp ];
81+
82+
# cmakeXED = ''
83+
# include(${cxx-common}/ports/xed/XEDConfig.cmake)
84+
# '';
85+
86+
# NIX_DEBUG = 1;
87+
88+
preConfigure = ''
89+
ghidra=$(mktemp -d)
90+
cp -r --no-preserve=mode ${ghidra-fork}/. $ghidra
91+
92+
substituteInPlace CMakeLists.txt \
93+
--replace 'FetchContent_Declare(sleigh' 'find_package(sleigh REQUIRED COMPONENTS Support) ${"\n"} message(STATUS "ignore FetchContent(Sleigh "' \
94+
--replace 'FetchContent_MakeAvailable(sleigh)' ""
5995
60-
nativeBuildInputs = [ python3 cmake ninja ];
96+
substituteInPlace CMakeLists.txt \
97+
--replace 'GIT_REPOSITORY https://github.com/trail-of-forks/ghidra.git' "SOURCE_DIR $ghidra"
6198
62-
configurePhase = "true";
99+
substituteInPlace CMakeLists.txt \
100+
--replace 'XED::XED' xed \
101+
--replace 'find_package(XED CONFIG REQUIRED)' "" \
102+
--replace 'find_package(Z3 CONFIG REQUIRED)' "" \
103+
--replace 'InstallExternalTarget(' 'message(STATUS ' \
63104
64-
buildPhase = ''
65-
which curl
66-
exit
67-
substituteInPlace scripts/build.sh \
68-
--replace 'source /etc/os-release' 'ID=arch' \
69-
--replace 'curl -LO "''${URL}"' 'true' \
70-
--replace 'tar -xJf "''${GITHUB_LIBS}" ''${TAR_OPTIONS}' 'mkdir -p $LIBRARY_VERSION && cp -r ${cxx-common}/. $LIBRARY_VERSION'
71105
106+
substituteInPlace CMakeLists.txt \
107+
--replace "sleigh_compile(" "set(sleigh_BINARY_DIR $out) ${"\n"} sleigh_compile("
72108
73-
ghidra=$(mktemp -d)
74-
cp -r ${ghidra}/. $ghidra
75-
echo ghidra = $ghidra
109+
cp -v $(command -v clang++) .
110+
substituteInPlace ./clang++ --replace 'cInclude=1' cInclude=0
76111
77-
sleigh=$(mktemp -d)
78-
cp -r ${sleigh}/. $sleigh
79-
echo sleigh = $sleigh
112+
platform=${lib.replaceStrings ["-" "."] ["_" "_"] stdenv.targetPlatform.config}
113+
LIBCXX=$(
114+
source ${clang}/nix-support/utils.bash;
115+
source ${clang}/nix-support/add-flags.sh;
116+
eval 'echo $NIX_CFLAGS_COMPILE_'$platform ' $NIX_CXXSTDLIB_COMPILE_'$platform)
80117
81-
cat $sleigh/src/setup-ghidra-source.cmake
82-
substituteInPlace $sleigh/src/setup-ghidra-source.cmake \
83-
--replace 'GIT_REPOSITORY https://github.com/NationalSecurityAgency/ghidra' "SOURCE_DIR $ghidra"
118+
substituteInPlace cmake/BCCompiler.cmake \
119+
--replace 'find_package(Clang CONFIG REQUIRED)' "" \
120+
--replace 'get_target_property(CLANG_PATH clang LOCATION)' "" \
121+
--replace 'get_target_property(LLVMLINK_PATH llvm-link LOCATION)' "" \
122+
--replace '$'{CLANG_PATH} $(pwd)/clang++ \
123+
--replace '$'{LLVMLINK_PATH} $(command -v llvm-link) \
124+
--replace '$'{include_directory_list} '$'{include_directory_list}" -include cstdlib"
84125
85-
substituteInPlace CMakeLists.txt \
86-
--replace 'GIT_REPOSITORY https://github.com/lifting-bits/sleigh.git' "SOURCE_DIR $sleigh"
126+
# failing due to "no thread api" and incorrectly including glibc
87127
88-
substituteInPlace
128+
export CXXFLAGS='-include cstdint -include cstdlib'
89129
90-
bash scripts/build.sh \
91-
--prefix $out \
92-
--extra-cmake-args "-DCMAKE_BUILD_TYPE=Release"
130+
substituteInPlace lib/Arch/*/Runtime/CMakeLists.txt \
131+
--replace 'c++17' 'c++20'
93132
'';
94133

95-
}
134+
cmakeFlags = [
135+
"-DCMAKE_VERBOSE_MAKEFILE=True"
136+
# "-DCMAKE_TOOLCHAIN_FILE=${cxx-common}/scripts/buildsystems/vcpkg.cmake"
137+
# "-DCMAKE_PREFIX_PATH=${cxx-common}/installed/x64-linux-rel"
138+
"-DDVCPKG_TARGET_TRIPLET=x64-linux-rel"
139+
"-DGIT_EXECUTABLE=${git-am-shim}"
140+
"-DCMAKE_VERBOSE_MAKEFILE=True"
141+
"-DFETCHCONTENT_QUIET=OFF"
142+
143+
# "-DCMAKE_BC_COMPILER=${llvmPackages.libcxxClang}/bin/clang"
144+
# "-DCMAKE_BC_LINKER=${llvmPackages.llvm}/bin/llvm-link"
145+
# "-DCLANG_PATH=${llvmPackages.libcxxClang}/bin/clang"
146+
];
147+
148+
})

llvm-translator/sleigh.nix

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
{ lib
2+
, stdenv
3+
, fetchFromGitHub
4+
, python3
5+
, cmake
6+
, ninja
7+
, git-am-shim
8+
}:
9+
10+
let
11+
sleigh-src = fetchFromGitHub {
12+
owner = "lifting-bits";
13+
repo = "sleigh";
14+
rev = "7c6b7424467d0382a1303c278633e99b0d094d5b";
15+
hash = "sha256-Di/maGPXHPSM/EUVTgNRsu7nJ0Of+tVRu+B4wr9OoBE=";
16+
};
17+
# https://github.com/lifting-bits/sleigh/blob/7c6b7424467d0382a1303c278633e99b0d094d5b/src/setup-ghidra-source.cmake
18+
ghidra-src = fetchFromGitHub {
19+
owner = "NationalSecurityAgency";
20+
repo = "ghidra";
21+
rev = "80ccdadeba79cd42fb0b85796b55952e0f79f323";
22+
hash = "sha256-7Iv1awZP5lU1LpGqC0nyiMxy0+3WOmM2NTdDYIzKmmk=";
23+
};
24+
25+
in
26+
stdenv.mkDerivation (self: {
27+
pname = "sleigh";
28+
version = "unstable";
29+
30+
src = sleigh-src;
31+
32+
nativeBuildInputs = [ python3 cmake ninja ];
33+
34+
preConfigure = ''
35+
ghidra=$(mktemp -d)
36+
cp -r --no-preserve=mode ${ghidra-src}/. $ghidra
37+
38+
substituteInPlace src/setup-ghidra-source.cmake \
39+
--replace 'find_package(Git REQUIRED)' "set(GIT_EXECUTABLE ${git-am-shim})" \
40+
--replace 'GIT_REPOSITORY https://github.com/NationalSecurityAgency/ghidra' "SOURCE_DIR $ghidra"
41+
42+
echo '
43+
if(NOT ''${ghidra_head_git_tag} EQUAL ${ghidra-src.rev})
44+
message(FATAL_ERROR "nix: ghidra hash mismatch (sleigh expected: ''${ghidra_head_git_tag}, nix provided: ${ghidra-src.rev})")
45+
endif()
46+
' >> src/setup-ghidra-source.cmake
47+
'';
48+
49+
sleigh_ADDITIONAL_PATCHES = [ ];
50+
51+
cmakeFlags = [
52+
"-Dsleigh_RELEASE_TYPE=HEAD"
53+
"-Dsleigh_ADDITIONAL_PATCHES=${lib.concatStringsSep ";" self.sleigh_ADDITIONAL_PATCHES}" ];
54+
})

overlay.nix

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ let
2121
retdec-uq-pac = prev.callPackage ./llvm-translator/retdec-uq-pac.nix { retdec = final.retdec5; };
2222
llvm-rtti-eh = prev.callPackage ./llvm-translator/llvm-rtti-eh.nix { };
2323
alive2 = prev.callPackage ./llvm-translator/alive2.nix { };
24+
remill = prev.callPackage ./llvm-translator/remill.nix { };
25+
sleigh = prev.callPackage ./llvm-translator/sleigh.nix { };
2426

2527
_overlay = overlay;
2628
};

0 commit comments

Comments
 (0)