Articles of glibc

为什么glibc没有使用fork来实现sys_fork?

在eglibc的nptl/sysdeps/unix/sysv/linux/i386/fork.c有一个定义: #define ARCH_FORK() \ INLINE_SYSCALL (clone, 5, \ CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0, \ NULL, NULL, &THREAD_SELF->tid) 这在实际的__libc_fork()用作实现的核心。 但是,例如在Linux的arch/x86/entry/syscalls/syscall_32.tbl存在一个sys_fork条目,以及在syscalls_64.tbl 。 所以Linux显然有它的fork特殊系统调用。 所以现在我想知道:为什么glibc在clone方面实现fork() ,如果内核已经提供了fork系统调用?

有谁知道是否有人已经集成了libsegfault.so和gdbserver以便将gdb连接到一个崩溃的程序?

它在http://sourceware.org/ml/gdb/2007-06/msg00360.html中有提及。 但似乎没有人真的实现过这种想法。 是否有任何障碍来实现这一点? 我的要求如下: 能够插入任何elf二进制可执行文件(例如使用LD_PRELOAD) 二进制文件可能是一个multithreading的可执行文件 二进制文件可以链接到包含main函数的库 这应该工作在x86以外的各种CPU架构(至lessMIPS,ARM,PPC) 所以,如果已经有这样的解决scheme,我想要一个链接,但如果还没有,我想知道为什么它没有被实现为一个轮子。 也许只是没有人不需要它,但我认为这是准备作为一个标准相当有用。 任何技术或政治问题,而不是把它放在一起代码是想要的。

即使使用`noexecstack`,堆栈也是可执行的

我试图保护我的应用程序免受缓冲区溢出攻击。 除此之外,我正在使用不可执行的堆栈,并将我的二进制文件与noexecstack标记链接(通过将-Wl,-z,noexecstack给gcc)。 一切似乎都很好 – readelf确认PT_GNU_STACK指定正确的权限: $ readelf -l target | grep -A1 GNU_STACK GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 RW 10 execstack : $ execstack -q target – target 只有一个问题。 我所有的堆栈都是可执行的: root@170ubuntu16p04-64smp-1:~# cat /proc/12878/task/*/maps | grep stack 7ffcac654000-7ffcac675000 rwxp 00000000 00:00 0 [stack] 7fe540e66000-7fe541666000 rwxp 00000000 00:00 0 [stack] 7fe540665000-7fe540e65000 rwxp 00000000 00:00 0 [stack] […]

我如何重播multithreading应用程序?

我想logging同步操作,例如锁,sempahores,multithreading应用程序的障碍,以便以后可以重放录制的应用程序,以进行debugging。 在途中是提供自己的锁,sempaphore,条件variables等function,也做日志logging,但我认为这是一个矫枉过正,因为下来,他们必须使用一些常见的同步操作。 所以我的问题是我应该logging哪些同步操作,所以我需要对我的程序进行最小的修改。 换句话说,glibc和系统调用中的函数或macros是通过哪个同步操作构build的? 所以我只修改那些日志logging和重放。

备用glibcdynamic链接程序的库path顺序(ld.so)

我需要使用一个替代的glibc版本,比我的系统上安装的更新( 2.18 vs 2.15 )。 这里和这里涵盖了几个相关的问题。 我在这里问的具体问题如下: 我build立了新的dynamic连接器( ld-2.18.so )的库path,以便在旧的libc ( libc-2.15.so )之前find新的libc ( libc-2.15.so )。 但是,当我尝试用新的ld运行一个程序时, libc的旧版本被拾取,产生一个SEGV 。 为什么会这样呢? 注意:我知道这可以通过在编译时使用–rpath或在运行时使用LD_LIBRARY_PATH 。 但是,我仍然想明白为什么还需要其中之一。 细节如下: 我下载了glibc-2.18并将其构build在/opt/glibc-2.18 。 默认情况下,文件/opt/glibc-2.18/etc/ld.so.conf丢失。 我创build了它,并更新了新的glibc的库caching,如下所示。 我强调: 新的libc是在旧的libc之前find的 : $ cat /opt/glibc-2.18/etc/ld.so.conf /opt/glibc-2.18/lib /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/mesa /lib /usr/lib $ /opt/glibc-2.18/sbin/ldconfig -v |& grep -E '^[^'$'\t'']|libc\.' /opt/glibc-2.18/sbin/ldconfig: Path `/opt/glibc-2.18/lib' given more than once […]

glibc中的哪个函数调用主函数

我想了解Linux如何启动一个程序。 我读了一些glibc中的函数调用main函数的地方。 使用callgrind进行分析并查看Kcachegrind中的调用图,我会below main看到below main调用的main。 但是我不明白这个,函数不能这样命名。 所以我的问题是glibc中的哪个函数实际启动了主函数。

在Linux上parsing$ PATH时,我们必须考虑什么样的情况?

我正在处理一个C程序,它必须走$ PATH才能find二进制文件的完整path名,唯一允许的依赖项是glibc(即不需要调用外部程序)。 在正常情况下,这只需要用冒号拆分getenv(“PATH”)并逐个检查每个目录,但是我想确保覆盖了所有可能的转angular情况。 我应该注意什么问题? 特别是,相对path,以〜开头的path将被扩展到$ HOME,或者包含:char允许的path?

构build不需要最新glibc的软件的最佳方法是什么?

我正在尝试构build一个可以在多个Linux发行版上运行的二进制包。 它目前build立在Ubuntu 10.04上,但在Ubuntu 8.04上失败,出现以下错误: ./test: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./test) ./test: /usr/lib/libstdc.so.6: version `GLIBC_2.11' not found (required by ./test) 什么是解决这个问题的首选方法? 有没有办法在一个新的盒子上安装一个旧的glibc并构build它,或者我必须build立一个旧的分布? 如果我build立一个老的glibc,它会工作在一个新的glibc? 或者,也可以安装一些方便的编译器标志或软件包来解决这个问题吗?

当调用clock_gettime()可能返回的tv_nsec字段实际上超过了一秒?

当你调用clock_gettime()它会返回一个timespec结构。 struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ }; 我没有在手册页里find保证tv_nsec不会超过一秒的保证。 保证金是否存在? 它可以依赖于库(glibc?)的实施为Linux? 关键的想法是:我需要“正常化”来自clock_gettime()函数的任何结果吗?

为什么gcc在调用“main”之后会在程序中放置一个“halt”指令?

在Linux / i386系统上查看由gcc生成的elf可执行文件时,似乎它在调用“main”之后和“nop”之前放置了暂停指令(0xf4),例如: │ ……. ! entrypoint: │ ……. ! xor ebp, ebp │ 80482e2 ! pop esi │ 80482e3 ! mov ecx, esp*emphasized text* │ 80482e5 ! and esp, 0fffffff0h │ 80482e8 ! push eax │ 80482e9 ! push esp │ 80482ea ! push edx │ 80482eb ! push __libc_csu_fini │ 80482f0 ! push […]