C语言 strace: ld-linux无法运行简单的测试二进制文件



我正在尝试为我试图构建的嵌入式系统编译一些东西。然而,当运行我为系统构建的二进制文件时,我遇到了failed to map segment from shared object: Invalid argument。除了简单的循环和打印之外,任何程序都会发生这种情况。

以调试的名义,我构建了一个二进制文件(testbin),它简单地列出了当前目录的内容:
#include<stdio.h>
#include<dirent.h>
int main(void)
{
DIR *d;
struct dirent *dir;
d = opendir(".");
if (d)
{
while ((dir = readdir(d)) != NULL)
{
printf("%sn", dir->d_name);
}
closedir(d);
}
return(0);
}

由于系统在库方面有些不合作,我必须重写它,所以我这样运行程序:./ld-linux.so.3 ./testbin产生:

./testbin: error while loading shared libraries: ./shitls: failed to map segment from shared object: Invalid argument

…正如所怀疑的那样,testbin也需要外部库。我设法为系统静态编译strace,它运行得很好。所以我相当肯定,每当需要libc.so时,罪魁祸首就是。

通过ld-linux.so.3testbin上运行strace时:./strace ./ld-linux.so.3 ./testbin

. .我有了一些工作要做:

execve("./ld-linux.so.3", ["./ld-linux.so.3", "./testbin"], 0xbee2b554 /* 74 vars */) = 0
brk(NULL)                               = 0xb873c000
open("./testbin", O_RDONLY)             = 3
read(3, "177ELF1112(1311203004"..., 512) = 512
lseek(3, 1920, SEEK_SET)                = 1920
read(3, ""..., 1240) = 1240
lseek(3, 1601, SEEK_SET)                = 1601
read(3, "A2aeabi1(057-A6n7A101t2n422"..., 51) = 51
fstat64(3, {st_mode=S_IFREG|0777, st_size=5379, ...}) = 0
getcwd("/mnt/output", 128)    = 22
mmap2(0x5241ae00, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = -1 EINVAL (Invalid argument)
close(3)                                = 0
writev(2, [{iov_base="./testbin", iov_len=9}, {iov_base=": ", iov_len=2}, {iov_base="error while loading shared libra"..., iov_len=36}, {iov_base=": ", iov_len=2}, {iov_base="./testbin", iov_len=9}, {iov_base=": ", iov_len=2}, {iov_base="failed to map segment from share"..., iov_len=40}, {iov_base=": ", iov_len=2}, {iov_base="Invalid argument", iov_len=16}, {iov_base="n", iov_len=1}], 10./testbin: error while loading shared libraries: ./testbin: failed to map segment from shared object: Invalid argument
) = 119
exit_group(127)                         = ?
+++ exited with 127 +++

…但我不擅长阅读文本输出。任何指针在哪里运行二进制呱呱?

看起来您的开发系统根不匹配目标上的系统根库。一种选择是为你的芯片找到合适的交叉开发工具。另一种选择是从目标中提取rootfs,并尝试在您的qemu设置中针对它进行构建。例如:

LDFLAGS = -L/rootfs-mipsel/mipsel-linux-gnu -lusb-1.0 -ludev

同样,交叉编译器可以将所需的rootfs作为参数:--sysroot=/opt/rootfs-mipsel.

qemu中的当前开发工具可能使用与目标不同的ld.so版本。编译后可以使用patchelf:

进行编辑。
patchelf --set-interpreter /lib/ld.so.1 a.out

相关内容

  • 没有找到相关文章

最新更新