在支持同一个文件时找不到execve文件!

17 c unix linux bsd

我认识的人在跑'时遇到问题lmutil'所以我问过他们strace -f lmutil.为什么execve失败的"没有这样的文件"!!! 这是没有意义的,因为我正在stra同一个文件!到底是怎么回事?

strace -f /home/tabitha/Starprogram/FLEXlm_11.7/linux-x86_64-2.3.4/bin/lmutil
Run Code Online (Sandbox Code Playgroud)

输出:

execve("/home/tabitha/Starprogram/FLEXlm_11.7/linux-x86_64-2.3.4/bin/lmutil", ["/home/tabitha/Starprogram/FLEXlm"...], [/* 38 vars */]) = -1 ENOENT (No such file or directory)
dup(2)                                  = 3
fcntl(3, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd7cb8b0000
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
write(3, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
close(3)                                = 0
munmap(0x7fd7cb8b0000, 4096)            = 0
exit_group(1)                           = ?
Run Code Online (Sandbox Code Playgroud)

ldd输出

$ ldd ./lmutil
        linux-vdso.so.1 =>  (0x00007fffcd5ff000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00007fe40ebbe000)
        libm.so.6 => /lib/libm.so.6 (0x00007fe40e93b000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fe40e724000)
        libc.so.6 => /lib/libc.so.6 (0x00007fe40e3a1000)
        libdl.so.2 => /lib/libdl.so.2 (0x00007fe40e19d000)
        /lib64/ld-lsb-x86-64.so.3 => /lib64/ld-linux-x86-64.so.2 (0x00007fe40edf5000)
$ find . -name lmutil -exec file {} \;
./bin.linux.x86_64/lmutil: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), for GNU/Linux 2.4.0, stripped
./bin.linux.x86/lmutil: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), for GNU/Linux 2.2.5, stripped
./lmutil: Bourne shell script text executable

Gil*_*il' 14

您尝试执行的文件(…/lmutil)存在,但其"加载器"不存在,其中

  • 例如/lib/ld-linux.so.2,本机可执行文件的加载程序是其动态加载程序;
  • 脚本的加载程序是其shebang行中提到的程序,例如,/bin/sh如果脚本开头#!/bin/sh.

从目录的名称来看,很有可能lmutil是一个amd64 Linux二进制文件,它正在寻找/lib64/ld-linux-x86-64.so.2它的加载器,但你有一个运行386(即32位)用户空间的amd64 Linux内核.您需要为您的平台获取合适的二进制文件.

我认为这种情况是Unix最误导性的错误信息.不幸的是修复它很难:内核只能向程序的调用者报告一个数字错误代码,所以它只有"command not found"(ENOENT)的空间,而不是它正在寻找的加载器的名称.这是罕见的情况之一,strace没有帮助.


小智 6

你的ldd输出是指/lib64/ld-lsb-x86-64.so.3,但是这个加载器实际上可能不存在,除非(在Ubuntu上)你已经安装了lsb-core软件包.包的postinst脚本在/ lib*目录中创建相关的符号链接.


Lig*_*ica 0

execve 联机帮助页

成功时,execve() 不返回,错误时返回 -1,并适当设置 errno。

strace假设这-1意味着“找不到文件”,因为errnoENOENT-1并且strace没有区别。

本质上,您可以忽略这一点:-1just 意味着发生了一些错误。输出strace不会告诉您 的值errno是什么。

我写这篇文章是为了警告不要用strace和 返回值得出结论,即使结果可能errnoENOENT这样的