我有一个带有非常旧 glibc 的遗留系统,如果不进行大量的测试/验证工作,我们就无法升级它。
我现在需要在该系统上多次运行较新的程序(例如 Java 1.7)。我选择了 chroot 解决方案,在那里我打包了所有需要的库,并在 chroot 中运行服务。
虽然 chroot 非常有限,我宁愿尝试用 LD_LIBRARY_PATH 解决这个问题。不幸的是,我libc.so.6: cannot handle TLS data在尝试时遇到错误。
事实证明,我也需要/lib/ld-linux.so.2来自 chroot 的 。这有效:
LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program
Run Code Online (Sandbox Code Playgroud)
但是,java通过检查/proc/self/cmdline确定从何处加载其库来挫败我的伎俩,如果二进制文件未命名为“bin/java”,则失败。java 在启动期间也执行自身,使问题进一步复杂化。
在最后努力,使这项工作,我打开了Java二进制,十六进制编辑器和替换字符串/lib/ld-linux.so.2用/home/chroot/ld.so(并作出一个符号链接ld-linux.so.2),和它的工作!
但我认为每个人都会同意将每个新二进制文件的路径重写为嵌套系统的绝对路径是一个巨大的麻烦。
有谁知道使用自定义库路径(包括自定义 ld-linux.so)的更简洁方法?
我尝试在运行 NixOS 的 VM 上安装当前的 oracle jre。
现在发生以下情况:
[michas@cc:~]$ tar xvzf jre-7u40-linux-x64.tar.gz |grep bin/java
jre1.7.0_40/bin/javaws
jre1.7.0_40/bin/java_vm
jre1.7.0_40/bin/java
[michas@cc:~]$ ls -l ./jre1.7.0_40/bin/java
-rwxr-xr-x 1 michas nogroup 7750 Aug 27 09:17 ./jre1.7.0_40/bin/java
[michas@cc:~]$ ./jre1.7.0_40/bin/java
bash: ./jre1.7.0_40/bin/java: No such file or directory
Run Code Online (Sandbox Code Playgroud)
跆拳道?命名文件显然在那里。到底是怎么回事?
尝试进一步分析:
[michas@cc:~]$ strace ./jre1.7.0_40/bin/java
execve("./jre1.7.0_40/bin/java", ["./jre1.7.0_40/bin/java"], [/* 53 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
exit_group(1) = ?
+++ …Run Code Online (Sandbox Code Playgroud) 我知道那里有类似的问题,但我还没有找到解决方案,也没有找到这个确切的案例。该二进制文件是使用 GCC 4.7 在 Arch Linux 上构建的。该软件包在构建系统上运行良好。以下命令在以下位置执行:
Linux vbox-ubuntu 3.2.0-29-generic #46-Ubuntu SMP Fri Jul 27 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
有问题的文件位于此处。它是一个 Linux 64 位到 Windows 64 位交叉编译器。解压它以~/提供一个~/mingw64包含所有所需内容的目录。
当我尝试运行时,~/mingw64/x86_64-w64-mingw32/bin/as这就是我得到的:
bash: /home/ruben/mingw64/x86_64-w64-mingw32/bin/as: No such file or directory
Run Code Online (Sandbox Code Playgroud)
跑步file ~/mingw64/x86_64-w64-mingw32/bin/as给了我:
/home/ruben/mingw64/x86_64-w64-mingw32/bin/as: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x0b8e50955e7919b76967bac042f49c5876804248, not stripped
Run Code Online (Sandbox Code Playgroud)
跑步ldd ~/mingw64/x86_64-w64-mingw32/bin/as给了我:
linux-vdso.so.1 => (0x00007fff3e367000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2ceae7e000) …Run Code Online (Sandbox Code Playgroud) 我正在寻找 CentOS 中 MAC 的 install_name_tool 的替代品。正是我想在非默认位置构建 MySQL。此外,mysql 二进制文件的共享库应该位于非默认位置并正确链接。
我无法将共享库 libssl 和 libcrypto 链接到 mysqld 二进制文件。
[user@localhost mysql]$ ldd /usr/local/mysql/bin/mysqld
linux-gate.so.1 => (0x00186000)
libpthread.so.0 => /lib/libpthread.so.0 (0x008e2000)
libz.so.1 => /lib/libz.so.1 (0x0097f000)
librt.so.1 => /lib/librt.so.1 (0x00912000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x00c70000)
libdl.so.2 => /lib/libdl.so.2 (0x00727000)
libssl.so.1.0.0 => not found
libcrypto.so.1.0.0 => not found
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00a7e000)
libm.so.6 => /lib/libm.so.6 (0x008b0000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00a70000)
libc.so.6 => /lib/libc.so.6 (0x00755000)
/lib/ld-linux.so.2 (0x00731000)
Run Code Online (Sandbox Code Playgroud)
我确定 openssl 安装在 /usr/local/extra 目录中,因为我也完美安装了 apache,目前正在运行,我的配置命令是:
cmake . -LH -DCMAKE_INCLUDE_PATH=/usr/local/extra/include -DCMAKE_LIBRARY_PATH=/usr/local/extra/lib …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试使用 NixOs 中的 Nix 包管理器安装 dot-net-core-sdk 2.0。
我对 NixOs、Nix、bash 脚本和 ELF 之类的东西都很陌生。但是我认为我已经成功地为 dot-net-core-sdk 2.0 创建了一个有效的 Nix 包描述。
但是,当我尝试创建一个新console项目时,它抱怨找不到控制台模板:
No templates matched the input template name: console.
Run Code Online (Sandbox Code Playgroud)
我已经定义了我的 Nix 包和构建脚本,如下所示:
dotnet-sdk.nix
with import <nixpkgs> {};
stdenv.mkDerivation {
name = "dotnet-sdk-2.0";
builder = ./builder.sh;
libPath = stdenv.lib.makeLibraryPath
[ lttng-tools kerberos zlib gettext openssl icu libunwind eject stdenv.cc.cc glib ];
src = fetchurl {
url = "https://download.microsoft.com/download/1/B/4/1B4DE605-8378-47A5-B01B-2C79D6C55519/dotnet-sdk-2.0.0-linux-x64.tar.gz";
sha256 = "6059a6f72fb7aa6205ef4b52583e9c041fd128e768870a0fc4a33ed84c98ca6b";
};
}
Run Code Online (Sandbox Code Playgroud)
建设者.sh
source $stdenv/setup
mkdir -p $out/dotnet-sdk
echo …Run Code Online (Sandbox Code Playgroud)