0

我发现如果我添加-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?

4

1 回答 1

1

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

您可以通过以下修补来强制使用互斥锁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实现相比,您几乎没有任何收获。

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

于 2013-04-24T23:21:43.307 回答