用musl-built tclsh8.6执行脚本时出现 "没有这样的文件或目录"。

1 人关注

我试图用tclsh8.6运行一个简单的tcl脚本,这个脚本是我在x86_64的Debian上用musl工具链从源头编译的。

The script, hello.tcl , looks like this:

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库和include文件都被安装到前缀/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的东西,所以我试图避免我在其他地方发现的一个潜在的解决方案,那就是用apt-get重新安装tcl或tcl-dev。

是什么导致了这个错误?如果有任何指导/帮助,我们将不胜感激。谢谢 :)

根据一些评论的要求,这里有一些补充信息。

替换代码6】命令的输出。

$ 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

替换代码8】命令的输出。

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

希望这些新的信息能有更多帮助。

EDIT 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 ) )

这是一个链接器脚本,如果你让它可执行就会失败,并说库被破坏了。

5 个评论
你能在没有任何参数的情况下运行它以得到一个tcl副本吗?
@Shawn 我已经试过了,它给出了同样的错误。
而 file /usr/local/x86_64-linux-musl/bin/tclsh8.6 又是怎么说的呢?
这是很奇怪的。 strace /usr/local/x86_64-linux-musl/bin/tclsh8.6 hello.tcl 可能会报告一些关于出错的情况。(它将产生一个 lot 的输出,所以你需要仔细阅读...)
(因为在我的系统上,/usr/bin/tclsh8.6是一个共享对象,使用/lib64/ld-linux-x86-64.so.2作为解释器,我猜你的musl也是这样,但它寻找的链接器并不存在,因此出现了错误)
linux
tcl
musl
peachykeen
peachykeen
发布于 2020-11-16
1 个回答
peachykeen
peachykeen
发布于 2020-11-18
已采纳
0 人赞同

在@Shawn的帮助下,我得以弄清我的问题。

tclsh8.6 正在寻找位于 /lib/ld-musl-x86_64.so.1 的程序解释器,但它并不存在--我猜当我安装musl-cross-make时,它并没有设置这个。为了解决这个问题,我简单地将 ld-musl-x86_64.so.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

然而,我仍然得到一个错误,但这一次是一个权限错误。

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