相关疑难解决方法(0)

单个主机上有多个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万
查看次数

如何在Linux上执行x86,arm,GCC和icc上的原子操作?

每个现代操作系统都提供一些原子操作:

  • Windows有Interlocked*API
  • FreeBSD有 <machine/atomic.h>
  • Solaris有 <atomic.h>
  • Mac OS X有 <libkern/OSAtomic.h>

对Linux有什么相似之处?

  • 我需要它在大多数Linux支持的平台上工作,包括:x86,x86_64和 arm.
  • 我需要它至少在GCC和英特尔编译器上工作.
  • 我不需要使用像glib或qt这样的第三方库.
  • 我需要它在C++中工作(C不是必需的)

问题:

  • __sync_*并非所有平台(ARM)都支持GCC原子内置,并且英特尔编译器不支持.
  • AFAIK <asm/atomic.h>不应该在用户空间中使用,我根本没有成功使用它.此外,我不确定它是否适用于英特尔编译器.

有什么建议?

我知道有很多相关的问题,但有些问题指出__sync*哪些对我来说是不可行的(ARM),有些人指出asm/atomic.h.

也许有一个内联汇编库可以为GCC执行此操作(ICC支持gcc汇编)?

编辑:

仅对添加操作有一个非常局部的解决方案(允许实现原子计数器但不能锁定需要CAS的自由结构):

如果您使用libstc++(英特尔编译器使用libstdc++),那么您可以使用或__gnu_cxx::__exchange_and_add中定义的.取决于编译器版本.<ext/atomicity.h><bits/atomicity.h>

但是,我仍然希望看到支持CAS的东西.

c c++ linux atomic

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

如何在普通C中启动线程?

我在C中使用了fork()来启动另一个进程.如何开始新线程?

c multithreading

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

如何在C中进行原子增量和获取?

我正在寻找一种原子地增加短路的方法,然后返回该值.我需要在内核模式和用户模式下执行此操作,因此它在C语言下,在Linux下,在Intel 32位架构上.不幸的是,由于速度要求,互斥锁不是一个好的选择.

有没有其他方法可以做到这一点?在这一点上,似乎唯一可用的选项是内联一些程序集.如果是这样的话,有人能指出我适当的指示吗?

c linux x86 atomic

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

Linux上的C中的原子操作

我正在尝试将我从Mac OS X编写的一些代码移植到Linux上,并且很难找到适合OSX的替代品OSAtomic.h.我找到了gcc __sync*系列,但我不确定它是否与我的旧编译器/内核兼容.我需要在GCC v4.1.2和内核2.6.18上运行代码.

我需要的具体操作是:

  • 增量
  • 递减
  • 比较和交换

有点奇怪的是,locate stdatomic.h在linux机器上运行会找到头文件(在c ++目录中),而在我的OSX机器上运行相同的命令(gcc v4.6.3)则不会返回任何内容.我需要安装什么来获取stdatomic库,它是否适用于gcc v 4.1.2?

作为旁注,我不能使用任何第三方库.

c linux gcc atomic

5
推荐指数
2
解决办法
8967
查看次数

读取由 ISR 更新的 64 位变量

我没有找到太多关于非原子操作的材料。

\n

假设我有一个 32 位处理器,并且我想在 64 位变量中保留微秒计数。中断将每微秒更新一次变量。调度程序是非抢占式的。将有一个函数用于清除变量,另一个函数用于读取变量。由于它是 32 位处理器,因此访问将是非原子的。是否有 \xe2\x80\x9cstandard\xe2\x80\x9d 或惯用的处理方法,以便读取器函数不会获得半更新的值?

\n

c embedded atomic interrupt

5
推荐指数
2
解决办法
1484
查看次数

标签 统计

c ×5

atomic ×4

linux ×4

gcc ×2

c++ ×1

embedded ×1

glibc ×1

interrupt ×1

multithreading ×1

x86 ×1