diff --git a/GPL/DemanglerGnu/build.gradle b/GPL/DemanglerGnu/build.gradle index 13b8cf7f33..1fa482295e 100644 --- a/GPL/DemanglerGnu/build.gradle +++ b/GPL/DemanglerGnu/build.gradle @@ -84,6 +84,8 @@ model { targetPlatform "mac_arm_64" targetPlatform "freebsd_x86_64" targetPlatform "freebsd_arm_64" + targetPlatform "openbsd_x86_64" + targetPlatform "openbsd_arm_64" sources { c { source { @@ -108,6 +110,8 @@ model { targetPlatform "mac_arm_64" targetPlatform "freebsd_x86_64" targetPlatform "freebsd_arm_64" + targetPlatform "openbsd_x86_64" + targetPlatform "openbsd_arm_64" sources { c { source { diff --git a/GPL/nativeBuildProperties.gradle b/GPL/nativeBuildProperties.gradle index f2505898f3..5685ddc858 100644 --- a/GPL/nativeBuildProperties.gradle +++ b/GPL/nativeBuildProperties.gradle @@ -49,6 +49,10 @@ model { gcc(Gcc).target(current) clang(Clang).target(current) } + if (isOpenBSD(current)) { + gcc(Gcc).target(current) + clang(Clang).target(current) + } if (isWindows(current) && VISUAL_STUDIO_INSTALL_DIR) { // https://github.com/gradle/gradle-native/issues/617#issuecomment-575735288 visualCpp(VisualCpp) { diff --git a/GPL/nativePlatforms.gradle b/GPL/nativePlatforms.gradle index 3b08da6170..5d832b2b14 100644 --- a/GPL/nativePlatforms.gradle +++ b/GPL/nativePlatforms.gradle @@ -27,7 +27,9 @@ project.ext.PLATFORMS = [ [name: "mac_x86_64", os: "osx", arch: "x86_64"], [name: "mac_arm_64", os: "osx", arch: "arm64"], [name: "freebsd_x86_64", os: "freebsd", arch: "x86_64"], - [name: "freebsd_arm_64", os: "freebsd", arch: "arm64"] + [name: "freebsd_arm_64", os: "freebsd", arch: "arm64"], + [name: "openbsd_x86_64", os: "openbsd", arch: "x86_64"], + [name: "openbsd_arm_64", os: "openbsd", arch: "arm64"] ] /********************************************************************************* @@ -57,6 +59,9 @@ ext.getCurrentPlatformName = { case ~/FreeBSD.*/: os = "freebsd" break + case ~/OpenBSD.*/: + os = "openbsd" + break default: throw new GradleException("Unrecognized platform operating system: $os") } @@ -132,6 +137,20 @@ ext.isCurrentFreeBSD = { return isFreeBSD(getCurrentPlatformName()) } +/********************************************************************************* + * Returns true if the given platform is OpenBSD. + *********************************************************************************/ +ext.isOpenBSD = { platform_name -> + return platform_name.startsWith("openbsd") +} + +/********************************************************************************* + * Returns true if the current platform is OpenBSD. + *********************************************************************************/ +ext.isCurrentOpenBSD = { + return isOpenBSD(getCurrentPlatformName()) +} + /********************************************************************************* * Returns true if the given platform is Windows. *********************************************************************************/ diff --git a/Ghidra/Features/Decompiler/buildNatives.gradle b/Ghidra/Features/Decompiler/buildNatives.gradle index d2332bafa4..10556dc6a7 100644 --- a/Ghidra/Features/Decompiler/buildNatives.gradle +++ b/Ghidra/Features/Decompiler/buildNatives.gradle @@ -45,6 +45,8 @@ model { targetPlatform "mac_arm_64" targetPlatform "freebsd_x86_64" targetPlatform "freebsd_arm_64" + targetPlatform "openbsd_x86_64" + targetPlatform "openbsd_arm_64" sources { cpp { // NOTE: The bison/flex generated files are assumed to be up-to-date. @@ -157,6 +159,8 @@ model { targetPlatform "mac_arm_64" targetPlatform "freebsd_x86_64" targetPlatform "freebsd_arm_64" + targetPlatform "openbsd_x86_64" + targetPlatform "openbsd_arm_64" sources { cpp { // NOTE: The bison/flex generated files are assumed to be up-to-date. diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/Makefile b/Ghidra/Features/Decompiler/src/decompile/cpp/Makefile index 61ebba3c72..9dfd2390ee 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/Makefile +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/Makefile @@ -35,6 +35,13 @@ ifeq ($(OS),Darwin) OSDIR=mac_x86_64 endif +ifeq ($(OS),OpenBSD) +ifeq ($(ARCH),amd64) + ARCH_TYPE=-m64 + OSDIR=openbsd_x86_64 +endif +endif + CXX=g++ -std=c++11 # Debug flags diff --git a/Ghidra/Features/FileFormats/buildNatives.gradle b/Ghidra/Features/FileFormats/buildNatives.gradle index 7501715968..010f09bd60 100644 --- a/Ghidra/Features/FileFormats/buildNatives.gradle +++ b/Ghidra/Features/FileFormats/buildNatives.gradle @@ -36,6 +36,8 @@ model { targetPlatform "mac_arm_64" targetPlatform "freebsd_x86_64" targetPlatform "freebsd_arm_64" + targetPlatform "openbsd_x86_64" + targetPlatform "openbsd_arm_64" sources { c { diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/Platform.java b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/Platform.java index 06e37c2afe..a7c152720f 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/Platform.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/Platform.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -80,6 +80,16 @@ public enum Platform { */ FREEBSD_ARM_64(OperatingSystem.FREE_BSD, Architecture.ARM_64, "freebsd_arm_64", ".so", ""), + /** + * Identifies a OpenBSD x86 64-bit OS. + */ + OPENBSD_X86_64(OperatingSystem.OPEN_BSD, Architecture.X86_64, "openbsd_x86_64", ".so", ""), + + /** + * Identifies a OpenBSD ARM 64-bit OS. + */ + OPENBSD_ARM_64(OperatingSystem.OPEN_BSD, Architecture.ARM_64, "openbsd_arm_64", ".so", ""), + /** * Identifies an unsupported OS. */ @@ -234,6 +244,11 @@ public enum Platform { paths.add("/System/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_x86_64"); paths.add("/System/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_x86_64h"); } + else if (operatingSystem == OperatingSystem.OPEN_BSD) { + paths.add("/usr/lib"); + paths.add("/usr/X11R6/lib"); + paths.add("/usr/local/lib"); + } else if (CURRENT_PLATFORM == WIN_X86_64) { String windir = System.getenv("SystemRoot"); if (windir != null) { diff --git a/Ghidra/Framework/Utility/src/main/java/ghidra/framework/OperatingSystem.java b/Ghidra/Framework/Utility/src/main/java/ghidra/framework/OperatingSystem.java index e803f338a1..2a2a5464dd 100644 --- a/Ghidra/Framework/Utility/src/main/java/ghidra/framework/OperatingSystem.java +++ b/Ghidra/Framework/Utility/src/main/java/ghidra/framework/OperatingSystem.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -20,6 +20,7 @@ public enum OperatingSystem { LINUX("Linux"), MAC_OS_X("Mac OS X"), FREE_BSD("FreeBSD"), + OPEN_BSD("OpenBSD"), UNSUPPORTED("Unsupported Operating System"); /** diff --git a/Ghidra/Framework/Utility/src/main/java/utility/application/ApplicationUtilities.java b/Ghidra/Framework/Utility/src/main/java/utility/application/ApplicationUtilities.java index c47527e807..134c9b6188 100644 --- a/Ghidra/Framework/Utility/src/main/java/utility/application/ApplicationUtilities.java +++ b/Ghidra/Framework/Utility/src/main/java/utility/application/ApplicationUtilities.java @@ -218,6 +218,7 @@ public class ApplicationUtilities { case WINDOWS -> new File(getEnvFile("LOCALAPPDATA", true), appName); case LINUX -> new File("/var/tmp/" + userDirName); case FREE_BSD -> new File("/var/tmp/" + userDirName); + case OPEN_BSD -> new File("/var/tmp/" + userDirName); case MAC_OS_X -> new File("/var/tmp/" + userDirName); default -> throw new FileNotFoundException( "Failed to find the user cache directory: Unsupported operating system."); @@ -275,6 +276,7 @@ public class ApplicationUtilities { case WINDOWS -> new File(getEnvFile("APPDATA", true), versionedSubdir); case LINUX -> new File(userHomeDir, ".config/" + versionedSubdir); case FREE_BSD -> new File(userHomeDir, ".config/" + versionedSubdir); + case OPEN_BSD -> new File(userHomeDir, ".config/" + versionedSubdir); case MAC_OS_X -> new File(userHomeDir, "Library/" + versionedSubdir); default -> throw new FileNotFoundException( "Failed to find the user settings directory: Unsupported operating system."); diff --git a/GhidraBuild/LaunchSupport/src/main/java/ghidra/launch/AppConfig.java b/GhidraBuild/LaunchSupport/src/main/java/ghidra/launch/AppConfig.java index 9760e5c724..7210f88b1b 100644 --- a/GhidraBuild/LaunchSupport/src/main/java/ghidra/launch/AppConfig.java +++ b/GhidraBuild/LaunchSupport/src/main/java/ghidra/launch/AppConfig.java @@ -453,6 +453,7 @@ public class AppConfig { new File(localAppDataDirPath, appName + "/" + userSettingsDirName); break; case LINUX: + case OPEN_BSD: userSettingsDir = new File(userHomeDir, ".config/" + appName + "/" + userSettingsDirName); break; diff --git a/GhidraBuild/LaunchSupport/src/main/java/ghidra/launch/JavaFinder.java b/GhidraBuild/LaunchSupport/src/main/java/ghidra/launch/JavaFinder.java index 400f26b6fd..8d82e27b0e 100644 --- a/GhidraBuild/LaunchSupport/src/main/java/ghidra/launch/JavaFinder.java +++ b/GhidraBuild/LaunchSupport/src/main/java/ghidra/launch/JavaFinder.java @@ -36,7 +36,7 @@ public abstract class JavaFinder { * The different supported platforms (operating systems). */ public enum Platform { - WINDOWS, MACOS, LINUX; + WINDOWS, MACOS, LINUX, OPEN_BSD; } /** @@ -54,6 +54,9 @@ public abstract class JavaFinder { if (os.contains("mac")) { return Platform.MACOS; } + if (os.contains("openbsd")) { + return Platform.OPEN_BSD; + } } return Platform.LINUX; } @@ -69,6 +72,8 @@ public abstract class JavaFinder { return new WindowsJavaFinder(); case MACOS: return new MacJavaFinder(); + case OPEN_BSD: + return new OpenBSDJavaFinder(); case LINUX: default: return new LinuxJavaFinder(); diff --git a/GhidraBuild/LaunchSupport/src/main/java/ghidra/launch/OpenBSDJavaFinder.java b/GhidraBuild/LaunchSupport/src/main/java/ghidra/launch/OpenBSDJavaFinder.java new file mode 100644 index 0000000000..79561b5cf0 --- /dev/null +++ b/GhidraBuild/LaunchSupport/src/main/java/ghidra/launch/OpenBSDJavaFinder.java @@ -0,0 +1,38 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.launch; + +import java.io.File; +import java.util.*; + +/** + * Class responsible for finding Java installations on an OpenBSD system. + */ +public class OpenBSDJavaFinder extends LinuxJavaFinder { + + @Override + protected List getJavaRootInstallDirs() { + File localdir = new File("/usr/local"); + + File[] filteredFiles = localdir.listFiles((dir, name) -> + name.toLowerCase().startsWith("jdk-") + ); + + return filteredFiles != null + ? new ArrayList<>(Arrays.asList(filteredFiles)) + : new ArrayList<>(); + } +} diff --git a/GhidraDocs/GettingStarted.md b/GhidraDocs/GettingStarted.md index d699181562..f844576205 100644 --- a/GhidraDocs/GettingStarted.md +++ b/GhidraDocs/GettingStarted.md @@ -203,6 +203,8 @@ Ghidra supports running on the following additional platforms with user-built na * Linux ARM 64-bit * FreeBSD x86 64-bit (no debugger support) * FreeBSD ARM 64-bit (no debugger support) +* OpenBSD x86 64-bit (no debugger support) +* OpenBSD ARM 64-bit (no debugger support) For supported systems where native binaries have not been supplied, or those that are supplied fail to run properly, it may be necessary to build the native Ghidra binaries. In order to build native @@ -214,7 +216,7 @@ binaries for your platform, you will need the following installed on your system to the Internet, _Xcode_ (which includes the command tools) may be installed directly from the App Store while _Command Line Tools for Xcode_ may be installed using the command: `xcode-select --install`. - * __Linux/FreeBSD:__ the 64-bit versions of the following packages should installed: + * __Linux/FreeBSD/OpenBSD:__ the 64-bit versions of the following packages should installed: * GCC or Clang * make * __Windows:__