Linux futex 5.4 OS内核版本2.6.9给出了问题

时间:2010-11-25 09:48:42

标签: c++

我们从RH 6.2迁移了一个C ++ RHEL 5.4应用程序,发现该应用程序已损坏。我们的一项调查得出结论,5.4框中的代码是指'futex'。注意app是使用32位编译器选项编译的 -

grep futex tool_strace.txt

futex(0xff8ea454, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0xf6d1f4fc, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0xf6c10a4c, FUTEX_WAKE_PRIVATE, 2147483647) = 0

As per http://www.akkadia.org/drepper/assumekernel.html I added the code on 5.4 build -

setenv("LD_ASSUME_KERNEL" , "2.4.1" , 1); // to use Linux Threads 

但strace转储仍然显示我被称为'futex'。

所有地址ff8ea454,f6d1f4fc和f6c10a4c都是32位地址。因此,如果我的假设正确,我怎么能编码“futex”调用可以被抑制或根本不被调用。

futex调用有任何已知问题吗?

1 个答案:

答案 0 :(得分:1)

我相信以下情况属实:

  1. 必须在程序开始生效之前设置LD_ASSUME_KERNEL。
  2. futex用于实现任何类型的锁,因此无法避免。
  3. 在编译自己的代码时,您应该不需要LD_ASSUME_KERNEL 根据需要使用更新的接口。
  4. 2.4.1是一个古老的内核版本,试图工作。鉴于你提到了32位编译,建议你使用AMD64架构机器,这甚至可能不支持库回到那么远。