Articles of glibc

ELF文件TLS和LOAD程序部分

int i; int main() { return i; } readelf -l编译readelf -l显示来自elf的程序头文件: Elf file type is EXEC (Executable file) Entry point 0xxxxx30 There are 6 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x08048000 0x08048000 0x79868 0x79868 RE 0x1000 > LOAD 0x079f94 0x080c2f94 0x080c2f94 0x0078c 0x02254 […]

Cygwin不支持glibc

Cygwin常见问题解答有关于“glibc在哪里? :Cygwin不提供glibc。 它使用newlib,它提供了很多(但不是全部)相同的function。 将glibc移植到Cygwin将会很困难。 我很惊讶,并检查了发行包,因为我以前使用过它。 当我检查存储库时,glibc似乎确实是cygwin的一部分,直到2.10版本。 任何人都可以告诉glibc后续版本的移植难度吗?

glibc – list和其他数据结构实现

我填充像我的谷歌search技能现在很差,无法find在glibc中的列表实现,发现哈希和树实现,但不是一个列表之一。 有没有glibc实现呢? 我不想重新格式化Linux内核链表macros,并在用户空间中使用它们。

运行这里编译的C程序导致GLIBC库在另一台服务器上找不到错误 – 是我的错还是他们的?

这里编译的AC程序在我们的Ubuntu服务器上运行良好。 但是当其他人试图在他们特定的Linux服务器上运行它时,会出现以下错误: ./myprog-install: /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by ./myprog-install) ./myprog-install: /lib/tls/libc.so.6: version `GLIBC_2.7' not found (required by ./myprog-install) 我是否需要升级我们的glibc库并重新编译? 或者他们在服务器上丢失了什么? 如果我运行apt-cache显示libc6我的Ubuntu告诉我的版本是: Package: libc6 Priority: required Section: libs Installed-Size: 9368 Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> Architecture: i386 Source: eglibc Version: 2.11.1-0ubuntu7.10 如果我看http://packages.ubuntu.com/hardy/libc6目前的版本似乎是2.7-10ubuntu8.1。 我很困惑的数字。 一方面2.11-1-0是比2.7-11更高的数字。 另一方面,7.10是小于8.1的数字。 这只是我升级C库包和重新编译的问题吗? 或者是其他人的服务器缺less一些需要的库在那里兼容?

如何睡几个微秒

考虑下面的代码: #include <stdio.h> #include <time.h> #include <math.h> // Compile with gcc -lrt -lm -o test_clock test_clock.c #define CLOCK CLOCK_MONOTONIC int main(int argc, char** argv) { double temp, elapsed; int j; struct timespec requestStart, requestEnd, req; // Pseudo-sleep clock_gettime(CLOCK, &requestStart); temp = 0; for(j=0; j < 40; j++) temp += sin(j); clock_gettime(CLOCK, &requestEnd); elapsed = ( […]

为什么glibc和pthread库都定义了相同的API?

为什么glibc和pthread库都定义了相同的API? 这是快照 ubuntu@ubuntu:/lib$ objdump -T /lib/i386-linux-gnu/libc.so.6 |grep pthread_cond_signal 000f8360 g DF .text 00000039 GLIBC_2.3.2 pthread_cond_signal 0012b940 g DF .text 00000039 (GLIBC_2.0) pthread_cond_signal ubuntu@ubuntu:/lib$ objdump -T /lib/i386-linux-gnu/libpthread.so.0 |grep pthread_cond_signal 0000b350 g DF .text 0000007c (GLIBC_2.0) pthread_cond_signal 0000af90 g DF .text 000000fc GLIBC_2.3.2 pthread_cond_signal

如何链接glibc的iconv的实现?

GNU C库提供了iconv的实现 – 我如何使用它? 简单的程序: #include <iconv.h> int main( int argc, char **argv ) { iconv_t cd = iconv_open( "UTF-8", "ISO-8859-1" ); iconv_close( cd ); return 0; } 编译和链接: $ gcc -Wall iconv.c -o iconv /tmp/ccKAfXNg.o: In function `main': iconv.c:(.text+0x19): undefined reference to `libiconv_open' iconv.c:(.text+0x29): undefined reference to `libiconv_close' collect2: ld returned 1 exit status […]

POSIX取消点如何performance?

我一直在看glibc / nptl的取消点的实现,并将其与POSIX进行比较,除非我错了,这是完全错误的。 使用的基本模型是: int oldtype = LIBC_ASYNC_CANCEL(); /* switch to asynchronous cancellation mode */ int result = INLINE_SYSCALL(…); LIBC_CANCEL_RESET(oldtype); 根据POSIX: 在函数调用期间中止取消请求的副作用与在函数调用被信号中断时给出的单线程程序中可能出现的副作用相同函数返回[EINTR]。 任何这样的副作用发生在任何取消清理处理程序被调用之前。 我读这段文字是,如果我open ,我可以期望它要么取消(连同我的整个线程)之前,它无法打开文件, 或返回一个有效的文件描述符或-1和errno值,但永远不要创build一个新的文件描述符,然后将其丢失到无效。 另一方面,取消点的glibc / nptl实现似乎允许在系统调用返回之后但在LIBC_CANCEL_RESET发生之前发生取消请求的争用条件。 我疯了,还是他们的执行真的这个破? 如果是这样,POSIX是否允许这种破坏的行为(这似乎使取消完全无法使用,除非你手动推迟),还是他们公然忽略POSIX? 如果这种行为事实上被破坏了,那么在没有这种竞争条件的情况下实现它的正确方法是什么?

我应该允许strerror_r的大小是多less?

OpenGroup POSIX.1-2001定义了strerror_r ,就像Linux标准核心规范3.1一样 。 但是我找不到可以合理预期的错误信息的最大大小。 我期望有一些定义的地方,我可以把我的代码,但没有我能find。 代码必须是线程安全的。 这就是为什么使用strerror_r而不是strerror的原因。 有没有人知道我可以使用的符号? 我应该创build自己的? 例 int result = gethostname(p_buffy, size_buffy); int errsv = errno; if (result < 0) { char buf[256]; char const * str = strerror_r(errsv, buf, 256); syslog(LOG_ERR, "gethostname failed; errno=%d(%s), buf='%s'", errsv, str, p_buffy); return errsv; } 从文件: 开放组织基本规格问题6: 错误 在下列情况下,strerror_r()函数可能失败: [ERANGE]通过strerrbuf和buflen提供的存储空间不足以包含生成的消息string。 来源: 的glibc-2.7 /的glibc-2.7 /串/ […]

我如何强制PHP使用iconv的libiconv版本而不是CentOS安装的glibc版本?

我正在使用的代码在Windows XP和Mac OS X上完美运行。在CentOS(以及Fedora和Ubuntu)上testing时,代码无法正常工作。 searchnetworking导致我得出的结论是,这是导致问题的iconv的glibc版本。 所以现在我需要为Zend Lucene的iconv的libiconv版本正常工作。 我已经下载了libiconv并使用–prefix=/usr/local makeconfiguration, make ,然后make install没有任何错误的情况下make install 。 它似乎是成功安装,因为执行/usr/local/bin/iconv –version说版本是libiconv 。 虽然简单的iconv –version仍然给glibc版本。 然后,我使用–with-iconv=/usr/local从源代码重新编译了PHP。 但是, phpinfo()仍然显示正在使用的iconv是glibc版本。 我也已经使用–with-iconv-dir或使用/usr/local/bin/php尝试了其他几个编译。 当然,我重新编译PHP后重新启动了Web服务器。 我在/etc/httpd/conf/httpd.conf有以下行: LoadModule /usr/lib/httpd/modules/libphp5.so 而libphp5.so实际上是在/usr/lib/httpd/modules 。 phpinfo()显示PHP 5.3.3。 我也yum删除了预先安装的PHP 5.1。*只是为了确保。 但iconv仍在使用glibc版本。 ldd /usr/lib/httpd/modules/libphp5.so给出 linux-gate.so.1 => (0x003b1000) /usr/local/lib/preloadable_libiconv.so (0x00110000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x001ed000) librt.so.1 => /lib/librt.so.1 (0x0021f000) libmysqlclient.so.15 => /usr/lib/mysql/libmysqlclient.so.15 (0x003b2000) libldap-2.3.so.0 => […]