单个主机上有多个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) 链接gcc_s和gcc通过链接有什么区别LDFLAGS?
是gcc_s静态库和gcc共享库吗?
因为我正在寻找一个解决方案,其中提到链接反对,gcc而只gcc_s在我的情况下工作.我想知道真正的区别.
<<hidden symbol `__name_here' in /some/library/path.a(_filename.o) is referenced by DSO
Run Code Online (Sandbox Code Playgroud)
在这种情况下,通常通过向gcc -print-libgcc-file-name链接标志(LDFLAGS)添加"-l gcc"或" "来解决问题.但是,与我的其他常规平台(i386,amd64,sparc64)不同,这还不够.经过大量的头脑冲击(公平地说,它也来自音乐)我意识到这个标志在链接libc 和 最终的可执行文件时都是必要的.链接:http://people.defora.org/~khorben/200903.html
我在信号处理程序中使用' backtrce() '和' backtrace_symbols_fd() '函数来生成用于调试的回溯(GDB不可用).
它们在x86桌面(Ubuntu)上工作正常,但在目标设备(基于ARM)上,Abort信号的回溯(由于双重自由错误)仅显示三个帧:信号处理程序和两个来自libc,这是没有用的用于调试我们的代码!在SEGV上回溯(例如使用坏指针)产生良好的回溯.
为什么我不能在ARM上获得有用的ABRT信号回溯?
[为清晰起见编辑了问题]
这是一个简单的测试程序,它演示了这个问题:
#include <execinfo.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
// Signal hangler to catch seg fault:
void handler_segv(int sig) {
// get void*'s for all entries on the stack
void *array[10];
size_t size;
size = backtrace(array, 10);
fprintf(stderr, "Error: Signal %d; %d frames found:\n", sig, size);
// print out all the frames to stderr
backtrace_symbols_fd(array, size, STDERR_FILENO);
exit(1);
}
void crashme()
{
// Deliberate Error: Abort (double free): …Run Code Online (Sandbox Code Playgroud) 我想提供共享库以及我的程序,而不是由于版本差异而使用目标系统.
ldd 说我的程序使用这些共享库:
linux-gate.so.1 => (0xf7ef0000)**(made by kernel)**
libc.so.6 => /lib32/libc.so.6 (0xf7d88000)**(libc-2.7.so)**
/lib/ld-linux.so.2 (0xf7ef1000)**(ld-2.7.so)**
Run Code Online (Sandbox Code Playgroud)
我通过编译成功链接了ld-xxx.so:
gcc -std=c99 -D_POSIX_C_SOURCE=200112L -O2 -m32 -s -Wl,-dynamic-linker,ld-2.7.so myprogram.c
Run Code Online (Sandbox Code Playgroud)
但我没有成功的链接libc-xxx.so.我怎样才能做到这一点 ?
我正在进行一些研究,并希望编辑libstdc ++库中的一些源代码进行实验.具体而言,我对试验并行排序算法感兴趣.有没有一个地方我可以找到文档来轻松编辑和构建源代码?
我试过构建各种版本的libstdc ++库,但没有成功.似乎大多数新版本都需要构建整个gcc包,这是一个更漫长的过程,特别是如果我要编辑和试验libstdc ++中的一些文件.
我也一直无法找到包含并行排序算法的源文件.我似乎只能找到定义函数的头文件,而不是源代码本身.任何建议或文档链接将不胜感激.