单个主机上有多个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) 我明白这std::atomic<>是一个原子对象.但原子到什么程度?根据我的理解,操作可以是原子的.使对象成为原子意味着什么?例如,如果有两个线程同时执行以下代码:
a = a + 12;
Run Code Online (Sandbox Code Playgroud)
然后是整个操作(比方说add_twelve_to(int))原子?或者是变量原子(so operator=())的变化?
当我在我的Ubuntu Lucid 10.04 PC上编译某些内容时,它会与glibc链接.Lucid使用了2.11的glibc.当我在另一台带有旧glibc的PC上运行这个二进制文件时,命令失败说没有glibc 2.11 ......
据我所知,glibc使用符号版本控制.我可以强制gcc链接特定的符号版本吗?
在我的具体用法中,我尝试为ARM编译gcc交叉工具链.
我在Qt的源代码中看到了一些x86程序集:
q_atomic_increment:
movl 4(%esp), %ecx
lock
incl (%ecx)
mov $0,%eax
setne %al
ret
.align 4,0x90
.type q_atomic_increment,@function
.size q_atomic_increment,.-q_atomic_increment
Run Code Online (Sandbox Code Playgroud)
从谷歌搜索,我知道lock指令将导致CPU锁定总线,但我不知道CPU何时释放总线?
关于以上整个代码,我不明白这段代码是如何实现的Add?
我有一个用C编写的数字运算应用程序.它是一种主循环,对于每个值调用,增加"i"的值,执行一些计算的函数.我读到了多线程,我正在考虑在C中学习一点.我想知道像我这样的某些通用代码是否可以自动多线程以及如何.
谢谢
PD为了了解我的代码,让我们说它是这样的:
main(...)
for(i=0;i<=ntimes;i++)get_result(x[i],y[i],result[i]);
Run Code Online (Sandbox Code Playgroud)
...
void get_result(float x,float y,float result){
result=sqrt(log (x) + log (y) + cos (exp (x + y));
(and some more similar mathematical operations)
}
Run Code Online (Sandbox Code Playgroud) 在C中是否有(POSIX-)可移植方式用于原子变量操作,类似于使用pthread的可移植线程?
原子操作是像"递增和获取"这样的操作,它们以原子方式执行,这意味着没有上下文切换可以干扰操作.在Linux内核空间中,我们必须使用atomic_t类型,在Java中我们有java.util.concurrent.atomic包.
在Linux上,atomic.h文件提供原子操作,但include依赖于平台,例如#include <asm-x86_64/atomic.h>,它在Mac OS X上不能以类似的方式提供.
我已经构建了glibc 2.14并将其安装在目录中~/GLIBC/glibc_install.现在我想使用这个C库而不是系统的默认C库来构建和运行程序.
为了确保我使用的是自定义glibc,我添加了一个put glibc/stdio-common/printf.c:__printf来打印消息的调用.
然后我重建并重新安装了glibc.
然后我写了一个"Hello,World"程序并尝试编译并链接如下:
gcc -nodefaultlibs -static -lgcc -L~/GLIBC/glibc_install/lib -o myprog myprog.c
Run Code Online (Sandbox Code Playgroud)但是我得到以下链接器错误报告:
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x19): undefined reference to `__libc_csu_init'
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x25): undefined reference to `__libc_start_main'
/tmp/ccACTQEp.o: In function `main':
c1.c:(.text+0xa): undefined reference to `puts'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我正在尝试编译自己的glibc.我有一个目录glibc,其中包含glibc我从互联网上下载的源代码.从我输入的目录中输入mkdir ../build-glibc.现在从build-glibc我输入的目录../glibc/configure中执行配置.现在我不知道怎么打电话make.我无法从glibc目录中调用它,因为它没有配置集,也不能从中调用它build-glibc,因为makefile不在该目录中.我该如何解决这个问题?
我需要在 C 中使用一个原子变量,因为这个变量是跨不同线程访问的。不想要竞争条件。
我的代码在 CentOS 上运行。我有哪些选择?
我正在寻找一种原子地增加短路的方法,然后返回该值.我需要在内核模式和用户模式下执行此操作,因此它在C语言下,在Linux下,在Intel 32位架构上.不幸的是,由于速度要求,互斥锁不是一个好的选择.
有没有其他方法可以做到这一点?在这一点上,似乎唯一可用的选项是内联一些程序集.如果是这样的话,有人能指出我适当的指示吗?