bash:./helloworld_s:没有这样的文件或目录。该文件显然在那里

时间:2019-03-23 22:42:26

标签: linux bash

我对bash并不陌生,但这是我第一次看到这种情况。

[OP@localhost linking]$ ls
helloworld-lib.o  helloworld-lib.s  helloworld_s
[OP@localhost linking]$ ./helloworld_s
bash: ./helloworld_s: No such file or directory

我在测试链接器ld时发生了此错误。 helloworld-lib.s的内容是:

[OP@localhost linking]$ cat helloworld-lib.s 
    .section .data
helloworld:
    .ascii "Hello, world!\n\0"

    .section .text
    .globl _start

_start:
    mov $helloworld, %rdi
    call printf

    mov $0, %rdi
    call exit

此文件helloworld_s的产生方式如下。

[OP@localhost linking]$ as helloworld-lib.s -o helloworld-lib.o
[OP@localhost linking]$ ld -lc helloworld-lib.o -o helloworld_s

IDK(如果其中任何相关信息)。仅供参考,如果我尝试运行其他文件,我只会得到一个被拒绝的权限(如预期的那样)。有什么想法吗?

编辑:根据建议,这是ls -l的输出:

[OP@localhost linking]$ ls -l
total 88
-rw-rw-r--. 1 OP OP   968 Mar 23 18:40 helloworld-lib.o
-rw-rw-r--. 1 OP OP   159 Mar 23 18:40 helloworld-lib.s
-rwxrwxr-x. 1 OP OP 14384 Mar 23 18:41 helloworld_s

这是id的输出:

[OP@localhost linking]$ id
uid=1000(OP) gid=1000(OP) groups=1000(OP),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

编辑:有关答案,请参阅评论。 See here

2 个答案:

答案 0 :(得分:1)

如redhat bug #868662中所述,推荐的链接方式是让gcc像下面这样调用ld;

> gcc -nostartfiles helloworld-lib.o -o helloworld_s -lc

这将导致正确的链接;

> ldd helloworld_s
        linux-vdso.so.1 =>  (0x00007ffd283bf000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fd011b62000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fd011f2f000)

执行正常;

> ./helloworld_s
Hello, world!

为什么ld链接到不存在的/lib/ld64.so.1?
因为这是通用系统的默认设置,而不仅仅是Linux。

答案 1 :(得分:0)

在实际问题是无法执行它们的情况下,现有的可执行文件可能会误报为丢失。

实际原因千差万别,但其中包括

  • 文件有缺陷,可能是由于另一个答案中提到的无效链接导致的

  • 该文件用于平台不支持的其他体系结构或ABI

  • 该文件缺少试图执行此操作的用户的执行许可权位

  • 文件位于带有禁止执行标志的卷上

在许多情况下,很显然,更具体,更相关的错误消息将是可取的,但是,有时实际实施的(或由不那么明显的失败路径触发)实际上确实会使您感到困惑。将“无法使用”的东西标记为“丢失”的精确度在不同环境下可能会有所不同。