在 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支持
尽管在 macBookPro 上编译和运行完美,但在 Mac mini 上编译项目的桥接头问题