ghidra
我目前正在尝试在我的 Ubuntu 20.04 机器上安装。安装过程中,我收到以下信息:
******************************************************************
JDK 11+ (64-bit) could not be found and must be manually chosen!
******************************************************************
Enter path to JDK home directory (ENTER for dialog):
所以,我觉得很酷,然后运行:
sudo apt-get install openjdk-11-jdk
如果我现在运行whereis java
:
/usr/share/java$ whereis java
java: /usr/bin/java /usr/share/java /usr/share/man/man1/java.1.gz
因此我 cd 到第一个目录,并查看:
/usr/share/java$ ls
commons-logging-1.2.jar java-atk-wrapper.jar pdfbox-1.8.16.jar
commons-logging-adapters-1.2.jar java_defaults.mk pdfbox.jar
commons-logging-adapters.jar java_uno.jar ridl-6.4.7.jar
commons-logging-api-1.2.jar juh-6.4.7.jar ridl.jar
commons-logging-api.jar juh.jar unoloader-6.4.7.jar
commons-logging.jar jurt-6.4.7.jar unoloader.jar
fontbox-1.8.16.jar jurt.jar
fontbox.jar libintl.jar
这里是一堆jar文件吗?一般jdk都有bin
文件夹之类的?
我也尝试提供/usr/share/java
ghidra 安装,但它抱怨说这不是一个有效的 jdk 主目录,因为它缺少一个bin
文件夹。
答案1
首先,通过运行确保安装正确完成java --version
,您应该会看到类似以下内容:
然后,为了找到 jdk 文件夹,运行以下命令:
readlink -f $(which java)
它返回路径,在我的情况下它返回:
/usr/lib/jvm/java-11-openjdk-amd64/bin/java
您可以运行它ls /usr/lib/jvm/java-11-openjdk-amd64
,它会显示 jdk 文件夹内容。它看起来像:
细节
为什么
首先whereis
!就像which
不解析符号链接一样!
which java
=> 给出命令路径 => 返回一个符号链接
Debian 中的示例:
/usr/bin/java
=符号链接到=> /etc/alternatives/java
=符号链接到=>/usr/lib/jvm/java-10-openjdk-amd64/bin/java
/usr/lib/jvm/java-10-openjdk-amd64/bin/java
是实际的 java 二进制文件!并且/usr/lib/jvm/java-10-openjdk-amd64
是 java 主页。
如果你想使用 whereis!你还需要解析符号链接!这里是递归的!
符号链接 => 符号链接 => 实际文件夹或文件
我们可以通过阅读链接来做到这一点
阅读链接
https://man7.org/linux/man-pages/man1/readlink.1.html
https://www.geeksforgeeks.org/readlink-command-in-linux-with-examples/
readlink-打印已解析的符号链接或规范文件名
简而言之!如果你有一个符号链接!
readlink symbolicLink
=> 将给出其解析的结果
给定Symlink1 => Symlink2 => path
readllink Symlink1
=返回=> 符号链接2
readlink Symlink2
=返回=> 路径`
这里我们用java来看一下:
一个命令
还有更好的!使用-f
标志
来自帮助文档
-f, --canonicalize canonicalize by following every symlink in
every component of the given name recursively;
all but the last component must exist
所以:
readlink -f $(which java)
递归解析符号链接!
您也可以通过 whereis 使用它!
您可以看到并找到您的主目录!
在这个上下文中使用which
!比 whereis 更好!
which
对于和之间的区别whereis
! 让我们使用whatis
$ whatis which
which (1) - shows the full path of (shell) commands
$ whatis whereis
whereis (1) - locate the binary, source, and manual page files for a command
答案2
由于您之前已经检查过whereis
二进制文件是否已安装,
现在您可以检查它是否可以正确执行:
它的位置是否属于你的 PATH 变量?尝试该命令
which java
,它应该返回类似/usr/bin/java
那么它是一个有效的二进制文件吗?尝试使用命令显示它的版本
java -version
,它应该显示类似
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)
- 还请记住,某些 Java 应用程序可能需要设置
JAVA_HOME
环境变量。然后,您可以将其设置为 Java 安装的主目录,例如JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
为了帮助您检索 java 主路径,您可以使用which java | xargs realpath
提供类似路径的路径/usr/lib/jvm/java-11-openjdk-amd64/bin/java
(或者您可以ls -l
在提供的路径上多次使用which
),您需要从中删除最新的部分/bin/java
。
PS:请注意,如果您的系统需要多个 Java 运行时,则 PATH 解析和 JAVA_HOME 必须与同一版本匹配。
您可以根据需要将任何特定版本解压缩到任何文件夹(如 /my/custom/install/jdk15/)中,并覆盖系统路径:
export JAVA_HOME=/my/custom/install/jdk15
export PATH=$JAVA_HOME/bin:$PATH
在我的系统上,我使用如下命令在 .bashrc 中设置 JAVA_HOME:
export JAVA_HOME=`dirname $(dirname $(readlink -f $(which java)))`
export PATH=$JAVA_HOME/bin:$PATH
答案3
whereis
和命令的替代方法find
是locate
命令。它非常快:
$ locate openjdk | head -n10
/home/rick/Android/Sdk/sources/android-28/org/openjdk
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/CollectorOps.java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/DoubleStreamTestDataProvider.java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/DoubleStreamTestScenario.java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/FlagDeclaringOp.java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/IntStreamTestDataProvider.java
这些是包含 的前 10 个文件名。您可以使用带有 (line count) 参数的 (word count) 命令openjdk
快速定位和统计文件数量:wc
-l
$ time locate java | wc -l
57555
real 0m0.945s
user 0m0.927s
sys 0m0.021s
$ time locate openjdk | wc -l
72
real 0m1.053s
user 0m1.033s
sys 0m0.021s
java
因此,文件名中有 57,555 个文件,openjdk
文件名中有 72 个文件。在这两种情况下,查找所有文件大约需要 1 秒钟。
为了真正体会该命令的速度,locate
请考虑搜索哪些文件名包含e
字母表中最常见的字母:
$ time locate e | wc -l
2283738
real 0m0.580s
user 0m0.592s
sys 0m0.177s
有 2,228,738 个文件的e
文件名中至少出现一次该字母。这是针对三个 Ubuntu 安装、一个 Windows 安装和一个共享的 Ubuntu + Windows 分区。只需半秒钟即可找到它们!
您可能必须locate
先安装该命令: