- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 Ubuntu 12.04(64 位)下设置了一个 chrooted Debian Etch(32 位),看起来 clock_gettime() 与 CLOCK_MONOTONIC 一起工作,但在 CLOCK_PROCESS_CPUTIME_ID 和 CLOCK_THREAD_CPUTIME_ID 上都失败了。 errno 设置为 EINVAL,根据手册页,这意味着“此系统不支持指定的 clk_id。”
所有三个时钟在 chrooted Debian 和 64 位 chrooted Debian etch 之外工作正常。
有人可以向我解释为什么会出现这种情况以及如何解决吗?
非常感谢。
最佳答案
我还不知道原因,但我有不适合评论框的想法。
首先,您可以通过将测试程序编译为 C 而不是 C++ 并且不将其链接到 libpthread 来简化测试程序。 -lrt
应该足以获取 clock_gettime
。此外,使用 -static
编译它可以使跟踪更容易,因为动态链接器启动的东西不会在那里。
静态链接甚至可能会改变 clock_gettime 的行为。值得一试,看看它是否能解决该错误。
我想看到的另一件事是这个 vdso 绕过测试程序的输出:
#define _GNU_SOURCE
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <sys/syscall.h>
int main(void)
{
struct timespec ts;
if(syscall(SYS_clock_gettime, CLOCK_PROCESS_CPUTIME_ID, &ts)) {
perror("clock_gettime");
return 1;
}
printf("CLOCK_PROCESS_CPUTIME_ID: %lu.%09ld\n",
(unsigned long)ts.tv_sec, ts.tv_nsec);
return 0;
}
使用和不使用-static
,如果失败,添加strace
。
几个更简单的测试思路:
-m32
添加到 gcc 命令,在 Ubuntu 主机系统中编译并运行 32 位测试程序。可能是内核的 32 位兼容模式导致了该错误。如果是这种情况,那么无论链接到哪个 libc,32 位版本都会失败。然后是困难的时候了。查看反汇编代码并可能在 gdb 中单步执行它。我不想让您自己执行此操作,而是希望获取您正在运行的代码的拷贝。在我能得到的地方上传一个静态编译的失败测试程序。您的内核提供的 32 位 vdso 拷贝也可能很有趣。要提取 vdso,请运行以下程序(在 32 位 chroot 中编译),这将创建一个名为 vdso.dump
的文件,并上传该文件。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int getvseg(const char *which, const char *outfn)
{
FILE *maps, *outfile;
char buf[1024];
void *start, *end;
size_t sz;
void *copy;
int ret;
char search[strlen(which)+4];
maps = fopen("/proc/self/maps", "r");
if(!maps) {
perror("/proc/self/maps");
return 1;
}
outfile = fopen(outfn, "w");
if(!outfile) {
perror(outfn);
fclose(maps);
return 1;
}
sprintf(search, "[%s]\n", which);
while(fgets(buf, sizeof buf, maps)) {
if(strlen(buf)<strlen(search) ||
strcmp(buf+strlen(buf)-strlen(search),search))
continue;
if(sscanf(buf, "%p-%p", &start, &end)!=2) {
fprintf(stderr, "weird line in /proc/self/maps: %s", buf);
continue;
}
sz = (char *)end - (char *)start;
/* copy because I got an EFAULT trying to write directly from vsyscall */
copy = malloc(sz);
if(!copy) {
perror("malloc");
goto fail;
}
memcpy(copy, start, sz);
if(fwrite(copy, 1, sz, outfile)!=sz) {
if(ferror(outfile))
perror(outfn);
else
fprintf(stderr, "%s: short write", outfn);
free(copy);
goto fail;
}
free(copy);
goto success;
}
fprintf(stderr, "%s not found\n", which);
fail:
ret = 1;
goto out;
success:
ret = 0;
out:
fclose(maps);
fclose(outfile);
return ret;
}
int main(void)
{
int ret = 1;
if(!getvseg("vdso", "vdso.dump")) {
printf("vdso dumped to vdso.dump\n");
ret = 0;
}
if(!getvseg("vsyscall", "vsyscall.dump")) {
printf("vsyscall dumped to vsyscall.dump\n");
ret = 0;
}
return ret;
}
我通过下载 etch libc 复制了这个。这绝对是 glibc 愚蠢造成的。而不是 clock_gettime 的简单系统调用包装器,它有一大堆预处理器意大利面条,最终导致“你不能使用我们没有预先批准的 clockid”。你不会让它与那个旧的 glibc 一起工作。这让我们想到了一个我不想问的问题:你为什么要尝试使用 Debian 的过时版本?
关于c++ - clock_gettime 在带有 CLOCK_PROCESS_CPUTIME_ID 的 chrooted Debian eclipse 刻中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12064404/
关闭。这个问题需要details or clarity .它目前不接受答案。 想改善这个问题吗?通过 editing this post 添加详细信息并澄清问题. 7年前关闭。 Improve thi
我尝试让我的代码在 chroot('/root/test1') 下工作,但它不能正常工作。 但是当我删除chroot('/root/test1'),修改execl("/test2", "test2",
如果我在 shell 脚本中写 chroot /home/mayank/chroot/codebase cd SBC 当我运行这个 shell 脚本时,它确实进入了 chroot 但没有执行命令 cd
Using chroot: Why do I get error from running sudo chroot /bin /bash ? 我从文档中了解到 chroot 应该执行 /bin/bas
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 7年前关闭。 Imp
我正在使用 C 语言在 UNIX 环境中开发网络服务器。目前,我已经完成了对进程的限制,但现在我无法使用系统日志和记录到文件选项,这主要是由于更改了根路径。 程序的新根路径是它的目录。我无法从它逃脱到
这是我遇到的情况: 我已经创建了一个 debootstrap ubuntu maverick(64 位)环境。我把它放在我的 ubuntu(64 位)清醒系统上的 /env/mav/ 中。我可以 ch
我可以使用 Dir.chroot chroot Dir.chroot("/var/chroot/mychroot") 但是我怎样才能从 chroot 返回呢? 最佳答案 chroot 的意义在于您无法
我正在开发一个 web 应用程序(在 Ubuntu 服务器上运行),它将允许用户运行 Octave 代码(基本上是 Matlab)。但是,我只希望他们能够读取或修改他们指定的主文件夹中的文件夹。 我知
我有一个 chroot 环境的小问题,我希望你能帮助我 :) 这是我的故事: 1 - 我创建了一个用户演示(有一个像/home/demo这样的家)并且我通过脚本/bin/chrootshell chr
为了避免将所有共享库和配置文件复制到 chroot 文件夹中,我计划在所有共享库和配置之后立即调用 chroot("path/to/folder");文件已加载。 先前加载的库中的缓冲区溢出漏洞是否会
虽然有another question与类似的主题,它不包括共享库在 chroot jail 中使用的内存。 假设我们有几个类似的 chroot。更具体地说,完全相同的二进制文件和共享库集,它们实际上
有 ubuntu img 是由砧木制作的 在 ARM 架构中运行 但我无法对 img 进行 chroot 很多人说这是依赖问题 如果我没有可用的加载器和/或共享库, 我应该做些什么? 我有 ubunt
我需要一些帮助,以了解为什么在PHP-FPM服务启动后的几分钟内,PHP-FPM chroot的PHP脚本无法解析FQDN。 当我(重新)启动PHP-FPM服务时,它会工作(解析成功)几秒钟,然后解析
我想知道 kazoo 库中是否有一种方法可以让 Zookeeper 在连接字符串中创建 chroot 路径(如果该路径尚不存在)?有人对此有经验吗?我已阅读文档,但我还没有真正找到任何可以处理此问题的
我尝试在 chroot 中运行一些 Python 程序,但出现以下错误 Could not find platform independent libraries Could not find pl
名为 =program.c 的程序的一部分 int memoryPercent() { int memoryPercent=0; FILE *pipe1 = NULL; pip
更新 知道了!看我的解决方案(第五条评论) 这是我的问题: 我创建了一个名为“jail”的小型二进制文件,并在/etc/password 中将其设为测试用户的默认 shell。 这是经过简化的源代码:
我正在尝试将数据写入 chroot 环境中的文件。由于我是非 root 用户,他们与 chroot 通信的唯一方法是使用 schroot 命令。 目前我正在使用以下技巧来写入数据。 $ schroot
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我是一名优秀的程序员,十分优秀!