Mat*_*nco 5 linux chroot dynamic-linking elf exec
;TL-DR -答案:因为缺少动态链接器 ld-linux-x86-64.so.2。
\n\n我已经-ro,loop在/mnt/foo.
它包含以下内容(/mnt/foo是挂载点):
\n-rwxr-xr-x 1 root root 110088 jan 17 2013 /mnt/foo/bin/ls\n-rw-r--r-- 1 root root 5212 jul 23 09:35 /mnt/foo/etc/ ld.so.cache\n-rw-r--r-- 1 个根 root 7 月 23 日 5 日 09:35 /mnt/foo/etc/ld.so.conf\n-rw-r--r-- 1 个根根 31168 maj 23 2013 /mnt/foo/lib/libacl.so.1\n-rw-r--r-- 1 root 根 18624 maj 20 2013 /mnt/foo/lib/libattr.so.1\n- rwxr-xr-x 1 根 1853400 okt 12 2013 /mnt/foo/lib/libc.so.6\n-rw-r--r-- 1 根 14664 okt 12 2013 /mnt/foo/lib/libdl .so.2\n-rw-r--r-- 1根根256224 mar 11 2013 /mnt/foo/lib/libpcre.so.3\n-rwxr-xr-x 1根根135757 okt 12 2013 / mnt/foo/lib/libpthread.so.0\n-rw-r--r-- 1 root root 31760 okt 12 2013 /mnt/foo/lib/librt.so.1\n-rw-r--r -- 1 root 134224 maj 23 2013 /mnt/foo/lib/libselinux.so.1\n\n\n
/mnt/foo/etc/ld.so.conf包含一行(包括换行符)/lib。
在创建文件系统之前,我运行了ldconfig -r ${TOPDIR}whereresolved到现在安装在.\nA on${TOPDIR}的位置,显示它包含诸如此类的字符串,所以我不认为这是共享库的问题。/mnt/foostrings/mnt/foo/etc/ld.so.cache/lib/libpcre.so.3
我认为这一定是我忽略的一些愚蠢的事情,但我自己无法弄清楚为什么简单的方法chroot /mnt/foo /bin/ls不起作用。
readelf -d /mnt/foo/bin/ls | grep NEEDED根据需要显示这些库:
\n 0x0000000000000001(需要)共享库:[libselinux.so.1]\n 0x0000000000000001(需要)共享库:[librt.so.1]\n 0x0000000000000001(需要)共享库:[libacl.so.1]\n 0x0000000000000001(需要)共享库:[libc.so.6]\n\n\n
最后,strace展示一下:
\nchroot("/mnt/foo") = 0\nchdir("/") = 0\nexecve("/bin/ls", ["/bin/ls"], [/* 32 vars */]) = -1 ENOENT(没有这样的文件或目录)\n\n\n这是完整的 strace chroot:
\n\n\n# strace -f chroot /mnt/foo /bin/ls\nexecve("/usr/sbin/chroot", ["chroot", "/mnt/foo", "/bin/ls"], [/* 32 vars */]) = 0\nbrk(0) = 0x1985000\naccess("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (没有这样的文件或目录)\nmmap(NULL, 8192, PROT_READ |PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc115ac8000\naccess("/etc/ld.so.preload", R_OK) = -1 ENOENT (没有这样的文件或目录)\nopen("/etc/ld. so.cache", O_RDONLY|O_CLOEXEC) = 3\nfstat(3, {st_mode=S_IFREG|0644, st_size=96457, ...}) = 0\nmmap(NULL, 96457, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc115ab0000\nclose(3) = 0\naccess("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (没有这样的文件或目录)\nopen("/lib/x86_64-linux-gnu/libc. so.6", O_RDONLY|O_CLOEXEC) = 3\nread(3, "\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0 \\0\\0\\3\\0>\\0\\1\\0\\0\\0\\360\\36\\2\\0\\0\\0\\0\ \0"..., 832) = 832\nfstat(3, {st_mode=S_IFREG|0755, st_size=1853400, ...}) = 0\nmmap(NULL, 3961912, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3 , 0) = 0x7fc1154e0000\nmprotect(0x7fc11569d000, 2097152, PROT_NONE) = 0\nmmap(0x7fc11589d000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1bd 000) = 0x7fc11589d000\nmmap(0x7fc1158a3000, 17464, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc1158a3000\nclose(3) = 0\nmmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc115aaf000\nmmap(NULL, 8192, PRO T_READ |PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc115aad000\narch_prctl(ARCH_SET_FS, 0x7fc115aad740) = 0\nmprotect(0x7fc11589d000, 16384, PROT_READ) = 0\nmprotect(0x606000,第4096章 保护4096, PROT_READ) = 0\nmunmap(0x7fc115ab0000, 96457) = 0\nbrk(0) = 0x1985000\nbrk(0x19a6000) = 0x19a6000\nopen("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3\nfstat(3, {st_mode=S_IFREG|0644, st_size=8463952, ...}) = 0\nmmap(NULL, 8463952, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc114ccd000\nclose(3) = 0\nchroot ("/mnt/foo") = 0\nchdir("/") = 0\nexecve("/bin/ls", ["/bin/ls"], [/* 32 vars */]) = -1 ENOENT(没有这样的文件或目录)\nopen("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = -1 ENOENT(没有这样的文件或目录)\nopen("/usr/share/locale/ en_US/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (没有这样的文件或目录)\nopen("/usr/share/locale/en/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (没有这样的文件或目录)\nopen("/usr/share/locale-langpack/en_US/LC_MESSAGES/coreutils.mo",O_RDONLY) = -1 ENOENT (没有这样的文件或目录)\nopen("/usr/share/locale-langpack/en/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (没有这样的文件或目录)\nopen ("/usr/lib/charset.alias", O_RDONLY|O_NOFOLLOW) = -1 ENOENT (没有这样的文件或目录)\nwrite(2, "chroot: ", 8chroot: ) = 8\nwrite(2, "失败运行命令 \\342\\200\\230/bin/ls"..., 35 运行命令 \xe2\x80\x98/bin/ls\xe2\x80\x99 失败) = 35\nopen("/usr/ share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (没有这样的文件或目录)\nopen("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = - 1 ENOENT (没有这样的文件或目录)\nopen("/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (没有这样的文件或目录)\nopen("/usr /share/locale-langpack/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (没有这样的文件或目录)\nwrite(2, ": 没有这样的文件或目录", 27: 没有这样的文件或目录) = 27\nwrite(2, "\\n", 1\n) = 1\nclose(1) = 0\nclose(2) = 0\nexit_group(127) = ?\n+++ 以 127 +++ 退出n\n\n那么,这是否具有ENOENT误导性?
是的 - ENOENT 有点误导。对我来说,它始终意味着“找不到文件”。
\n\n当找不到动态链接器时,execve() 得到 ENOENT。
\n\n当引导内核尝试加载init(或 linuxrc 或其他)时,我得到的错误是“无法执行 /linuxrc(错误 -2)。尝试默认值... ”。
该问题的发生是由于创建此初始 ramdisk 的脚本中的错误所致。(它省略了“=>”未指出的库ldd)。
为了获得额外学分,需要思考两个额外问题:
\n\nlinux-vdso.so.1什么?lddldd显示 ld-linux.so 没有“ =>”?问题是/bin/ls不仅仅需要您提供的共享库。它还需要加载它们的程序;Linux 加载器。
要解决您的问题,您可以将加载程序从您的系统(通常/lib/ld-linux.so.2)复制到 chroot ( ) 的位置/mnt/foo/lib/ld-linux.so.2。