c - strace输出问题

标签 c linux binary centos strace

我在 CentOS 和 Debian 上运行一个程序。输出完全相同,但在 Centos 中我得到了粗体的 3 行,而在 Debian 中却没有。这 3 行内容是什么?我怎样才能在 Debian 中获取它们?

execve("./z1", ["./z1"], [/* 31 vars */]) = 0
brk(0)                                  = 0x8458000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f41000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/home/myuser/public_html/libs/libmudflap.so.0", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0PJ\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=105432, ...}) = 0
mmap2(NULL, 943136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xd89000
mmap2(0xda2000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19) = 0xda2000
mmap2(0xda3000, 836640, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xda3000
close(3)                                = 0
open("/home/myuser/public_html/libs/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320m\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1327556, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f40000
mmap2(NULL, 1337704, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x891000
mprotect(0x9d1000, 4096, PROT_NONE)     = 0
mmap2(0x9d2000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x140) = 0x9d2000
mmap2(0x9d5000, 10600, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x9d5000
close(3)                                = 0
open("/home/myuser/public_html/libs/libdl.so.2", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\n\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=9736, ...}) = 0
mmap2(NULL, 12408, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x74e000
mmap2(0x750000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1) = 0x750000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f3f000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7f3f6c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
open("/dev/urandom", O_RDONLY)          = 3
read(3, "\f\233\37", 3)                 = 3
close(3)                                = 0
mprotect(0x750000, 4096, PROT_READ)     = 0

最佳答案

我认为这与 strace 没有任何关系。我不确定,但这可能与内存中事物的排列方式有关。我知道有些系统将二进制文件的一部分放置在内存中的随机位置,以防止恶意事件。这称为Address Space Layout Randomization (ASLR)。我猜测 CentOS 正在使用这个,而 Debian 则没有。请参阅this post关于在 CentOS 中禁用 ASLR。尝试一下,看看 strace 是否仍然显示/dev/urandom 正在打开。

因此,问题在于,可能是您的系统导致了差异,而不是 strace 或程序。

-- 编辑--

所以我上面的可能是错的。我对这个问题进行了大量研究,并设法缩小范围。我发现很可能是一个库在进行这些调用。我使用的方法有点复杂,但可行。 See this post如果您仍然好奇的话,可以了解它是如何完成的。

我使用 gnome (eog) 进行了此调试,因为我编写的简单测试程序没有触发 urandom 的读取。事实证明,Gkt+ 是我的例子中的罪魁祸首,它使用随机数为某些对象创建唯一的 id。我很想知道您的程序正在使用什么来进行这些调用。此时我怀疑是ASLR。

关于c - strace输出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5844540/

相关文章:

c++ - 我们如何在 C++ 中调用具有 "parameter=value"的函数?

assembly - 将二进制转换为十进制并在汇编中显示

c - 地址空间布局随机化是否应用于 fork 进程

c - 从 C 中的字符串中提取特定列

r - 如何用 1 和 0 覆盖 R 中的一列字符?

linux - 从已编译的二进制文件中获取宏值(带调试)

c - 如何使用 C 中的 open() 函数删除现有文件?

c - 不通过命令行写入文本文件

c - 复合语句的 GCC 评估

c - 执行 objdump 时没有堆栈或堆