Gcc 在sh4 CPU上编译zmq,并由DSO错误引用
我发现如果我添加-shared,它将解决make问题,但是,我不知道在哪里修改Makefile。我在Makefile中尝试了LDFLAGS、cxflags,但它无法工作Gcc 在sh4 CPU上编译zmq,并由DSO错误引用,gcc,makefile,zeromq,automake,Gcc,Makefile,Zeromq,Automake,我发现如果我添加-shared,它将解决make问题,但是,我不知道在哪里修改Makefile。我在Makefile中尝试了LDFLAGS、cxflags,但它无法工作 [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
[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?很可能是
-shared
将错误延迟到运行时,这将显示GCC for SuperH没有完全的原子支持。因此,选项是对所需的原子进行编码或使用互斥回退
您可以通过以下方式修补configure.ac
来强制使用互斥锁:
sh-* | sh[34]*-*)
AC_DEFINE(ZMQ_FORCE_MUTEXES, 1, [Force to use mutexes])
;;
这不会比本机支持差太多,因为超级硬件仅通过tas.b
op提供对字节的测试和设置。互斥操作可替换为以下比较和交换:
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
op移动到mutex\u t
实现,但需要为锁引入一个全局变量,通过互斥体的pthread实现,您几乎得不到任何好处
运行一个性能测试,看看是否有任何可测量的性能改进,甚至降级,并向上游提交一个拉请求,让其他人享受 你是如此强大,如何检测问题是由没有sh4支持的gcc引起的。为什么不将
unsigned int oldval
定义为unsigned char
?要快速检查,请尝试使用互斥锁,我已经制作了一个修补程序,但它无法工作,仍然显示相同的错误消息。我不熟悉automake。@DanielYCLin您需要运行autogen.sh
从configure.ac
重新创建configure
文件。您可以始终grep sh-configure
来确认它的应用。我的构建脚本,and./configure包含sh-patch