1

我正在尝试使用 tclsh8.6 运行一个简单的 tcl 脚本,该脚本是我使用 x86_64 Debian 上的 musl 工具链从源代码编译的。

脚本 ,hello.tcl看起来像这样:

puts hello

当我尝试运行它时,出现以下错误:

$ /usr/local/x86_64-linux-musl/bin/tclsh8.6 hello.tcl
-bash: /usr/local/x86_64-linux-musl/bin/tclsh8.6: No such file or directory

必要的 tcl 库和包含文件都安装到前缀/usr/local/x86_64-linux-musl. 二进制文件也存在:

$ ls -l /usr/local/x86_64-linux-musl/bin/tclsh8.6
-rwxr-xr-x 1 root root 8328 Nov 15 12:18 /usr/local/x86_64-linux-musl/bin/tclsh8.6

$ ldd /usr/local/x86_64-linux-musl/bin/tclsh8.6 
    linux-vdso.so.1 (0x00007ffd04718000)
    libtcl8.6.so => /usr/local/x86_64-linux-musl/lib/libtcl8.6.so (0x00007f005981e000)
    libc.so => /usr/local/x86_64-linux-musl/lib/libc.so (0x00007f0059587000)

我想保持基于 musl 的东西,所以我试图避免我在其他地方找到的潜在解决方案,即重新安装 tcl 或 tcl-dev 与apt-get.

是什么导致了这个错误?非常感谢任何指导/帮助。谢谢 :)

编辑

根据一些评论的要求,这里是一些附加信息。

命令的输出file

$ file /usr/local/x86_64-linux-musl/bin/tclsh8.6 
/usr/local/x86_64-linux-musl/bin/tclsh8.6: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-x86_64.so.1, not stripped

命令的输出strace

strace /usr/local/x86_64-linux-musl/bin/tclsh8.6 hello.tcl 
execve("/usr/local/x86_64-linux-musl/bin/tclsh8.6", ["/usr/local/x86_64-linux-musl/bin"..., "hello.tcl"], 0x7fffb8c5b278 /* 19 vars */) = -1 ENOENT (No such file or directory)
strace: exec: No such file or directory
+++ exited with 1 +++

看到这个输出后,我检查了加载器/解释器是否存在,/lib但它不存在。为了解决这个问题,我跑了:

$ sudo ln -s /usr/local/x86_64-linux-musl/lib/ld-musl-x86_64.so.1 /lib/ld-musl-x86_64.so.1

当我运行时,这给了我一个不同的错误tclsh8.6

$ /usr/local/x86_64-linux-musl/bin/tclsh8.6 hello.tcl 
-bash: /usr/local/x86_64-linux-musl/bin/tclsh8.6: Permission denied

运行它sudo会给出同样的结果:

$ sudo /usr/local/x86_64-linux-musl/bin/tclsh8.6 hello.tcl 
sudo: unable to execute /usr/local/x86_64-linux-musl/bin/tclsh8.6: Permission denied

解释器和脚本的权限如下:

$ ls -l /usr/local/x86_64-linux-musl/bin/tclsh8.6 
-rwxr-xr-x 1 root root 8328 Nov 15 13:34 /usr/local/x86_64-linux-musl/bin/tclsh8.6
$ ls -l hello.tcl 
-rwxr-xr-x 1 user user 11 Nov 15 12:44 hello.tcl

希望这些新信息能提供更多帮助。

编辑 2

更多权限信息:)

$ ls -l /lib/ld-musl-x86_64.so.1 
lrwxrwxrwx 1 root root 52 Nov 16 10:04 /lib/ld-musl-x86_64.so.1 -> /usr/local/x86_64-linux-musl/lib/ld-musl-x86_64.so.1

$ ls -l /usr/local/x86_64-linux-musl/lib/ld-musl-x86_64.so.1 
lrwxrwxrwx 1 root root 12 Nov 15 12:02 /usr/local/x86_64-linux-musl/lib/ld-musl-x86_64.so.1 -> /lib/libc.so

$ $ ls -l /lib/libc.so
-rw-r--r-- 1 root root 246 Nov 14 15:15 /lib/libc.so

这是以下内容/lib/libc.so

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( //lib/libc.so.6 //lib/libc_nonshared.a  AS_NEEDED ( //lib/ld-linux-x86-64.so.2 ) )

它是一个链接器脚本,如果你使可执行文件失败并说库已损坏。

4

1 回答 1

1

在@Shawn 的帮助下,我能够找出我的问题。

tclsh8.6正在寻找/lib/ld-musl-x86_64.so.1不存在的程序解释器 - 我想当我安装 musl-cross-make 时它没有设置它。为了解决这个问题,我只是从所在位置符号链接ld-musl-x86_64.so.1lib

$ sudo ln -s /usr/local/x86_64-linux-musl/lib/ld-musl-x86_64.so.1 /lib/ld-musl-x86_64.so.1

但是,我仍然收到错误消息,但这次是权限错误:

$ /usr/local/x86_64-linux-musl/bin/tclsh8.6 hello.tcl 
-bash: /usr/local/x86_64-linux-musl/bin/tclsh8.6: Permission denied

事实证明,它ld-musl-x86_64.so.1最终成为了一个符号链接,它解析/lib/libc.so为一个链接描述文件,而不是我们想要的可执行 DSO。我相应地更改了这个符号链接:

sudo ln -fs /usr/local/x86_64-linux-musl/lib/libc.so /usr/local/x86_64-linux-musl/lib/ld-musl-x86_64.so.1

在那之后,我可以执行我的脚本,一切都像一个魅力!:)

于 2020-11-17T20:34:42.097 回答