标签: glibc

为什么要快速运行glibc的问题太复杂了?

我在这里浏览strlen代码,想知道是否真的需要代码中使用的优化?例如,为什么下面这样的东西不能同样好或更好?

unsigned long strlen(char s[]) {
    unsigned long i;
    for (i = 0; s[i] != '\0'; i++)
        continue;
    return i;
}
Run Code Online (Sandbox Code Playgroud)

较简单的代码对编译器进行优化是否更好或更容易?

strlen链接后面页面上的代码如下所示:

/* Copyright (C) 1991, 1993, 1997, 2000, 2003 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Written by Torbjorn Granlund (tege@sics.se),
   with help from Dan Sahlin (dan@sics.se);
   commentary by Jim Blandy (jimb@ai.mit.edu).

   The GNU C Library is free software; you can redistribute it and/or
   modify it under …
Run Code Online (Sandbox Code Playgroud)

c optimization portability glibc strlen

283
推荐指数
7
解决办法
5万
查看次数

单个主机上有多个glibc库

单个主机上有多个glibc库

我的linux(SLES-8)服务器目前有glibc-2.2.5-235,但我有一个程序无法在这个版本上运行,需要glibc-2.3.3.

是否可以在同一主机上安装多个glibc?

这是我在旧glibc上运行程序时遇到的错误:

./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./myapp)
./myapp: /lib/i686/libpthread.so.0: version `GLIBC_2.3.2' not found (required by ./myapp)
./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./libxerces-c.so.27)
./myapp: /lib/ld-linux.so.2: version `GLIBC_2.3' not found (required by ./libstdc++.so.6)
./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./libstdc++.so.6)
Run Code Online (Sandbox Code Playgroud)

所以我创建了一个名为newglibc的新目录,并将以下文件复制到:

libpthread.so.0
libm.so.6
libc.so.6
ld-2.3.3.so
ld-linux.so.2 -> ld-2.3.3.so
Run Code Online (Sandbox Code Playgroud)

export LD_LIBRARY_PATH=newglibc:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

./myapp: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by ./newglibc/libpthread.so.0)
./myapp: /lib/ld-linux.so.2: version `GLIBC_2.3' not found (required by libstdc++.so.6)
./myapp: …
Run Code Online (Sandbox Code Playgroud)

linux gcc glibc

155
推荐指数
7
解决办法
15万
查看次数

如何链接到特定的glibc版本?

当我在我的Ubuntu Lucid 10.04 PC上编译某些内容时,它会与glibc链接.Lucid使用了2.11的glibc.当我在另一台带有旧glibc的PC上运行这个二进制文件时,命令失败说没有glibc 2.11 ......

据我所知,glibc使用符号版本控制.我可以强制gcc链接特定的符号版本吗?

在我的具体用法中,我尝试为ARM编译gcc交叉工具链.

linux linker gcc glibc libc

99
推荐指数
7
解决办法
8万
查看次数

在C代码中使用C++库

我有一个C++库,提供各种用于管理数据的类.我有库的源代码.

我想扩展C++ API以支持C函数调用,以便库可以同时与C代码和C++代码一起使用.

我正在使用GNU工具链(gcc,glibc等),因此语言和体系结构支持不是问题.

有什么理由说明技术上不可能吗?

是否有任何疑难杂症的,我需要注意?

是否有关于此的资源,示例代码和/或文档?


我发现的其他一些事情:

  1. 使用以下命令包装C代码需要使用的C++标头.

#ifdef __cplusplus
extern "C" {  
#endif  
//  
// Code goes here ...  
//  
#ifdef __cplusplus  
} // extern "C"  
#endif
Run Code Online (Sandbox Code Playgroud)
  1. 将"真正的"C++接口保存在C未包含的单独头文件中.在此处考虑PIMPL原理.使用#ifndef __cplusplus #error东西可以帮助检测任何疯狂.
  2. 小心C++标识符作为C代码中的名称
  3. 在C和C++编译器之间大小不一的枚举.如果您使用GNU工具链可能不是问题,但仍然要小心.
  4. 对于结构体,请遵循以下形式,以便C不会混淆.

    typedef struct X { ... } X
    
    Run Code Online (Sandbox Code Playgroud)
  5. 然后使用指针传递C++对象,它们只需要在C中声明为struct X,其中X是C++对象.

所有这一切都是由一位C++精灵的朋友提供的.

c c++ gcc glibc

97
推荐指数
3
解决办法
8万
查看次数

如何在Debian上将glibc从2.13升级到2.15?

我听说我可以使用apt-get install libc6来完成它,但我需要在/etc/apt/sources.list中添加一些内容来接收最新的glibc版本.我该怎么办?

debian glibc

64
推荐指数
4
解决办法
18万
查看次数

启用优化后,为什么此代码慢6.5倍?

我想基准glibcstrlen功能,出于某种原因,发现它显然执行慢与GCC启用优化,我不知道为什么。

这是我的代码:

#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main() {
    char *s = calloc(1 << 20, 1);
    memset(s, 65, 1000000);
    clock_t start = clock();
    for (int i = 0; i < 128; ++i) {
        s[strlen(s)] = 'A';
    }
    clock_t end = clock();
    printf("%lld\n", (long long)(end - start));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,它输出:

$ gcc test.c && ./a.out
13336
$ gcc -O1 test.c && ./a.out
199004
$ gcc -O2 test.c && ./a.out
83415 …
Run Code Online (Sandbox Code Playgroud)

c performance gcc glibc

64
推荐指数
2
解决办法
3997
查看次数

Linux静态链接已经死了?

事实上,Linux上的-static gcc标志现在不起作用.让我引用GNU libc FAQ:

2.22.即使是静态链接的程序也需要一些我不能接受的共享库.我能做什么?

如果没有共享库,{AJ} NSS(详细信息只需输入`info libc"Name Service Switch"')将无法正常工作.NSS允许通过仅更改一个配置文件(/etc/nsswitch.conf)而不重新链接任何程序来使用不同的服务(例如NIS,文件,db,hesiod).唯一的缺点是现在静态库需要访问共享库.这由GNU C库透明地处理.

解决方案是使用--enable-static-nss配置glibc.在这种情况下,您可以创建一个仅使用服务dns和文件的静态二进制文件(为此更改/etc/nsswitch.conf).您需要明确链接所有这些服务.例如:

 gcc -static test-netdb.c -o test-netdb \
   -Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于您必须将使用NSS例程的每个静态程序与所有这些库链接起来.
{UD}事实上,不能再说使用此选项编译的libc正在使用NSS.没有开关了.因此,强烈 建议不要使用--enable-static-nss,因为这会使系统上程序的行为不一致.

关于这个事实,现在有什么合理的方法可以在Linux上创建一个功能齐全的静态构建,或者静态链接在Linux上完全没用?我的意思是静态构建:

  • 行为与动态构建完全相同(静态nss具有不一致的行为是邪恶的!);
  • 适用于glibc环境和Linux版本的合理变体;

linux gcc glibc static-linking

61
推荐指数
6
解决办法
4万
查看次数

gcc -D_FORTIFY_SOURCE = 1和-D_FORTIFY_SOURCE = 2之间的差异

有人能指出gcc -D_FORTIFY_SOURCE=1和之间的区别-D_FORTIFY_SOURCE=2吗?我想=2更安全吗?我找不到一个逐点列出差异的列表.

我还读过-D_FORTIFY_SOURCE=2应该使用的-O2,否则并非所有功能都可用.此外,我还没有找到一个列表,详细说明回归.我特别感兴趣的是编译-Os目标是一个没有那么多闪存的设备.

有关记录在哪里的任何提示欢迎!

security gcc glibc

60
推荐指数
2
解决办法
3万
查看次数

malloc实现是否会将free-ed内存返回给系统?

我有一个长期存在的应用程序,频繁的内存分配 - 释放.任何malloc实现都会将释放的内存返回给系统吗?

在这方面,什么是以下行为:

  • ptmalloc 1,2(默认为glibc)或3
  • dlmalloc
  • tcmalloc(谷歌线程malloc)
  • solaris 10-11默认malloc和mtmalloc
  • FreeBSD 8默认malloc(jemalloc)
  • Hoard malloc?

更新

如果我有一个应用程序,其白天和夜晚的内存消耗可能非常不同(例如),我可以强制任何malloc将系统释放的内存吗?

如果没有这样的返回,释放的内存将被多次换出,但这样的内存只包含垃圾.

malloc free mmap glibc tcmalloc

54
推荐指数
4
解决办法
2万
查看次数

没有libc编译

我想在没有(g)libc的情况下编译我的C代码.如何停用它以及哪些功能依赖于它?

我尝试了-nostdlib但它没有帮助:代码是可编译的并运行,但我仍然可以在我的可执行文件的hexdump中找到libc的名称.

c gcc glibc libc demo

53
推荐指数
2
解决办法
3万
查看次数