在 sh4 CPU 上编译 zmq 并发生由 DSO 错误引用

Posted

技术标签:

【中文标题】在 sh4 CPU 上编译 zmq 并发生由 DSO 错误引用【英文标题】:compile zmq on sh4 CPU and occurs referenced by DSO error 【发布时间】:2013-04-24 15:58:07 【问题描述】:

我发现如果我添加-shared,它会解决make问题,但是,我不知道在哪里修改Makefile。我已经在 Makefile https://gist.github.com/anonymous/5453234 中尝试过 LDFLAGS,CXXFLAGS,它无法工作。

[dlin@h perf]$ make V=1
/bin/sh ../libtool  --tag=CXX   --mode=link g++  -O2 -pipe -shared  -shared  -o local_lat local_lat.o ../src/libzmq.la -lrt -lpthread -shared
libtool: link: g++ -O2 -pipe -o .libs/local_lat local_lat.o  ../src/.libs/libzmq.so -lrt -lpthread
/usr/bin/ld: .libs/local_lat: hidden symbol `__sync_fetch_and_add_2' in /usr/lib/gcc/sh4-linux/4.2.4/libgcc.a(linux-atomic.o) is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
make: *** [local_lat] Error 1
[dlin@h perf]$ g++ -O2 -pipe -o .libs/local_lat local_lat.o  ../src/.libs/libzmq.so -lrt -lpthread
/usr/bin/ld: .libs/local_lat: hidden symbol `__sync_fetch_and_add_2' in /usr/lib/gcc/sh4-linux/4.2.4/libgcc.a(linux-atomic.o) is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
[dlin@h perf]$ g++ -O2 -pipe -o .libs/local_lat local_lat.o  ../src/.libs/libzmq.so -lrt -lpthread -shared

-shared 选项可以在最后一个命令手动写入,但是如何放入 Makefile?

【问题讨论】:

【参考方案1】:

很可能-shared 将错误延迟到运行时,看起来 GCC for SuperH 没有完整的原子支持。因此,选项是编码所需的原子或使用互斥体后备。

您可以通过使用以下内容修补 configure.ac 来强制使用互斥锁:

sh-* | sh[34]*-*)
    AC_DEFINE(ZMQ_FORCE_MUTEXES, 1, [Force to use mutexes])
    ;;

这不会比原生支持差很多,因为 SuperH 硬件仅通过 tas.b 操作提供字节的测试和设置。可以用以下比较和交换替换互斥操作:

static unsigned char sh_critical_section = 0;

inline static void sh_enter_critical_section (void)

  unsigned int oldval;   
  do
    __asm__ __volatile__ ("tas.b @%1; movt %0"
              : "=r" (oldval)
              : "r" (&sh_critical_section)
              : "t", "memory");
  while (oldval == 0);


inline static void sh_leave_critical_section (void)

  __asm__ __volatile__ (" " ::: "memory");
  sh_critical_section= 0;

因此可以进行以下修改:

#elif defined ZMQ_ATOMIC_COUNTER_SH
            sh_enter_critical_section ();
            old_value = value;
            value += increment_;
            sh_leave_critical_section ();    
#elif defined ZMQ_ATOMIC_COUNTER_MUTEX
            sync.lock ();
            old_value = value;
            value += increment_;
            sync.unlock ();
#else

这是多余的,因为功能与互斥锁实现相同,因此可以将tas.b 操作移至mutex_t 实现,但需要为锁引入一个全局变量,您几乎不会获得任何收益pthread 互斥体的实现。

运行性能测试,看看是否有任何可衡量的性能改进甚至下降,然后向上游提交拉取请求以供其他人使用!

【讨论】:

你太给力了,怎么检测是gcc没有sh4支持的问题。为什么不将unsigned int oldval 定义为unsigned char 为了快速检查尝试使用互斥锁,我做了一个补丁,gist.github.com/5458192,但它不能工作,仍然显示相同的错误消息。我不熟悉 automake。 @DanielYCLin 您需要运行autogen.sh 以从configure.ac 重新创建configure 文件。您可以随时grep sh- configure 确认已应用。 我的构建脚本PKGBUILD,configure.in 和error log 和./configure 包含了sh-patch

以上是关于在 sh4 CPU 上编译 zmq 并发生由 DSO 错误引用的主要内容,如果未能解决你的问题,请参考以下文章

如何在windows上编译Chromium (CEF3) 并加入MP3支持

试图在loongarch64上编译JNA失败

尽管在 macBookPro 上编译和运行完美,但在 Mac mini 上编译项目的桥接头问题

尽管在 macBookPro 上编译和运行完美,但在 Mac mini 上编译项目的桥接头问题

远程调试如何工作?代码需要在本地机器上编译吗?

如何在 QT Creator 中使用 mingw 在多核上编译