标签: glibc

如何将c/c ++应用程序移植到旧版Linux内核版本

好吧,这只是一个有趣的练习,但是对于一些较旧的Linux系统来说编译程序不是太难,或者可以吗?

我可以访问几个运行linux的古老系统,也许看看它们在负载下的表现会很有趣.举个例子,我们想用Eigen做一些线性代数,这是一个很好的只有头的库.有没有机会在目标系统上编译它?

user@ancient:~ $ uname -a
Linux local 2.2.16 #5 Sat Jul 8 20:36:25 MEST 2000 i586 unknown
user@ancient:~ $ gcc --version
egcs-2.91.66
Run Code Online (Sandbox Code Playgroud)

也许不是......所以让我们在当前系统上编译它.以下是我的尝试,主要是失败的.更多的想法非常受欢迎.

  1. 编译 -m32 -march=i386

    user@ancient:~ $ ./a.out
    BUG IN DYNAMIC LINKER ld.so: dynamic-link.h: 53: elf_get_dynamic_info: Assertion `! "bad dynamic tag"' failed!
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编译-m32 -march=i386 -static:运行在所有相当新的内核版本上,但如果它们稍微更旧并且具有众所周知的错误消息则会失败

    user@ancient:~ $ ./a.out
    FATAL: kernel too old
    Segmentation fault
    
    Run Code Online (Sandbox Code Playgroud)

    这是一个glibc错误,它支持最小内核版本,例如我的系统上的内核2.6.4:

    $ file a.out
    a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
    statically linked, for GNU/Linux …
    Run Code Online (Sandbox Code Playgroud)

c++ linux gcc glibc linux-kernel

14
推荐指数
2
解决办法
5053
查看次数

Linux 3.0:使用管道stdin/stdout执行子进程

在Linux 3.0/C++下:

我想要一个执行以下操作的函数:

string f(string s)
{
    string r = system("foo < s");
    return r;
}
Run Code Online (Sandbox Code Playgroud)

显然上面的方法不起作用,但你明白了.我有一个字符串s,我想传递作为应用程序"foo"的子进程执行的标准输入,然后我想将其标准输出记录到字符串r然后返回它.

我应该使用linux系统调用或posix函数的组合?

c c++ linux posix glibc

14
推荐指数
1
解决办法
3万
查看次数

当长度大于4GB时,mmap失败

(正确的代码在'Update 5'中)

我尝试在此示例C代码中映射从0x100000000到0x200000000的内存范围:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/mman.h>

int main(void)
{ 
    uint64_t* rr_addr = 0;
    uint64_t i = 17179869184;

    printf("\nsizeof(size_t): %llu\n", sizeof(size_t));

    printf("(uint64_t)0x100000000: %llx\n", (uint64_t)0x100000000);
    printf("1L << 33: %llx\n", 1L << 33);
    rr_addr = mmap((void*)i, (1UL << 33), PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0);
    printf("rr_addr: %p, %llu \n", rr_addr, rr_addr);
    if (rr_addr == MAP_FAILED) {
        perror("mmap error");
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在不同的系统(Linux,gcc)上,我得到了不同的结果:

结果1:

sizeof(size_t): 8
(uint64_t)0x100000000: 100000000
1L << 33: 200000000
rr_addr: 0xffffffffffffffff, 18446744073709551615 
mmap error: Cannot allocate memory …
Run Code Online (Sandbox Code Playgroud)

c linux gcc glibc fedora

13
推荐指数
1
解决办法
8798
查看次数

找不到GLIBC_2.7

尝试运行多个可执行文件时,我收到以下错误:

/lib/libc.so.6: version `GLIBC_2.7' not found (required by .tools/bridge/bridge)
Run Code Online (Sandbox Code Playgroud)

我最近从CentOS 5.3升级到5.7(我需要在CentOS 5上运行这些工具,所以我不能升级到6).我重新编译了整个代码,但仍然出现此错误.

有没有人遇到过这种类型的错误?

谢谢,克劳迪

glibc centos libc

13
推荐指数
1
解决办法
2万
查看次数

我可以用更新的gcc/clang来定位旧的linux吗?C++

现在我使用提供的gcc在某个旧版本的Linux(SLED 10)上编译我的C++软件,它可以在大多数新版本上运行,因为它们有更新的glibc.问题是,旧的gcc不支持C++ 11,我真的很想使用新功能.

现在我有一些想法,但我相信其他人也有同样的需求.什么对你有用?

思路:

  1. 构建一个更新的系统,静态链接到更新的glibc.(不可能,对吧?)
  2. 构建在较新的系统上,编译并链接旧的glibc.
  3. 使用更新的gcc构建旧系统,链接旧glibc.
  4. 构建一个更新的系统,动态链接到更新的glibc,设置RPath并为我们的glibc提供安装程序.

作为奖励,我的软件也支持插件并有一个SDK.我真的更喜欢我的客户可以编译我的库而不会有太大的麻烦.

提前致谢.欢迎提供,经过验证的解决方案

c++ linux glibc

13
推荐指数
1
解决办法
1963
查看次数

静态链接glibc但其他一些库与GCC动态链接

我需要静态链接glibc到我的项目,因为目标平台只支持一个非常旧的(但它与我的工具链中的静态链接glibc一起工作,我已经检查过了)

不幸的是,这个应用程序必须使用pthread库,但是静态链接的libpthread需要占用太多空间.

我想静态链接glibc,并动态pthread.

运行此命令后

powerpc-unknown-linux-gnu-gcc object_files -lrt -lpthread -Wl,-Bstatic -lc 
Run Code Online (Sandbox Code Playgroud)

我明白了:

/powerpc-unknown-linux-gnu/bin/ld: cannot find -lgcc_s
Run Code Online (Sandbox Code Playgroud)

c linker glibc static-linking

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

"fasttop"是什么意思?

我看到这个错误:

*** glibc detected *** perl: double free or corruption (fasttop): 0x0000000003c1daa0 ***
Run Code Online (Sandbox Code Playgroud)

错误之后是回溯.

我知道glibc是什么,我知道Perl是什么,我知道什么是双重释放,但是fasttop意味着什么?

c perl glibc

13
推荐指数
1
解决办法
2114
查看次数

无法加载linux-vdso.so.1的共享库符号.在调试时

不加载VDSO.so是使用gdb和glibc> 2.2时遇到的一个着名错误.我发现计划在gdb 7.5.1中修复,但事实并非如此.好吧,我找到了一个工作,在这里在这里,但我不明白它,如何使用它.

操作系统:Arch Linux
IDE:QT创建者3.0.82
编译器:GCC 4.8.2
注意:我不确定我是否违反规则,包括上面的链接

linux gdb glibc

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

如何关闭Glibc运行时保护?

我正在尝试了解代码漏洞,并正在测试我编写的一些简单程序.但是,Glibc在运行时捕获的许多问题(例如Stack-Smashing,Double Free等).因此,我希望能够在没有Glibc运行时检测错误的情况下运行我的程序.有没有办法关闭Glibc的检测?(比如编译器标志等).

我在之前的链接中看到它描述了如何关闭ASLR和Canaries,但这不是我想要做的,因为它仍然会阻止像Double Free和我想尝试的其他一些堆错误(http) ://stackoverflow.com/questions/2340259/how-to-turn-off-gcc-compiler-optimization-to-enable-buffer-overflow).

我也知道你可以用-w标志关闭编译时警告,但这似乎也不是我想要的.我已经尝试阅读GCC标志并查找有关Glibc的信息,但我还没有到达任何地方.因此,我将非常感谢任何帮助.谢谢.

c++ security testing gcc glibc

12
推荐指数
1
解决办法
9984
查看次数

运行chromedriver时出错:在CentOS6中"/lib64/libc.so.6:版本`GLIBC_2.14'未找到"

我正在尝试在CentOS 6上启动chromedriver.更多关于操作系统的信息

<code>[root@localhost bin]# uname --all
Linux localhost.localdomain 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux</code>
Run Code Online (Sandbox Code Playgroud)

它会引发以下错误:

[root@localhost bin]# ./chromedriver ./chromedriver: /lib64/libc.so.6: version `GLIBC_2.15' not found (required by ./chromedriver)

./chromedriver: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./chromedriver)

./chromedriver: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./chromedriver)

yum install gcc

[root@localhost bin]# ./chromedriver ./chromedriver: /lib64/libc.so.6: version `GLIBC_2.15' not found (required by ./chromedriver)

./chromedriver: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./chromedriver)

./chromedriver: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' …

glibc selenium-chromedriver

12
推荐指数
1
解决办法
3万
查看次数