我想将musl与OpenMP一起使用。但是,当我编译一个简单的OpenMP程序,如
int main() {
int i;
#pragma omp parallel for
for(i=0; i<100; i++) {
printf("asdf\n");
}
}
与
musl-gcc -fopenmp foo.c
我收到错误
/usr/bin/ld: h_errno: TLS definition in //lib/x86_64-linux-gnu/libc.so.6 section .tbss mismatches non-TLS definition in /usr/local/musl/lib/libc.so section .bss
//lib/x86_64-linux-gnu/libc.so.6: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
显然存在与线程本地存储(TLS)相关的问题。 如何让 musl 使用OpenMP?
我目前在Intel(R)Xeon(R)CPU E5-1620上使用Ubuntu 14.04,GCC 4.9.1,EGLIBC 2.19。
以下是我从musl-gcc -v -fopenmp omp.o
的collect2标记中发现的链接器的内容。我将大部分空间转换为换行符。如果没有-fopenmp
选项,这与此相关的唯一区别是添加了pthread
和gomp
。
-plugin /usr/lib/gcc/x86_64-linux-gnu/4.9/liblto_plugin.so
-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper
-plugin-opt=-fresolution=/tmp/ccPvNBKp.res
-plugin-opt=-pass-through=/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc.a
-plugin-opt=-pass-through=/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc_eh.a
-plugin-opt=-pass-through=-lpthread
-plugin-opt=-pass-through=-lc
-plugin-opt=-pass-through=/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc.a
-plugin-opt=-pass-through=/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc_eh.a
-dynamic-linker
/lib/ld-musl-x86_64.so.1
-nostdlib
-z relro
/usr/local/musl/lib/crt1.o
/usr/local/musl/lib/crti.o
/usr/lib/gcc/x86_64-linux-gnu/4.9/crtbegin.o
-L/usr/local/musl/lib
-L /usr/lib/gcc/x86_64-linux-gnu/4.9/.
omp.o
-lgomp
/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc.a
/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc_eh.a
-lpthread
-lc
/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc.a
/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc_eh.a
/usr/lib/gcc/x86_64-linux-gnu/4.9/crtend.o
/usr/local/musl/lib/crtn.o
以下是musl-gcc -fopenmpomp.c -Wl,--trace
/usr/bin/ld: mode elf_x86_64
/usr/local/musl/lib/crt1.o
/usr/local/musl/lib/crti.o
/usr/lib/gcc/x86_64-linux-gnu/4.9/crtbegin.o
-lc (/usr/local/musl/lib/libc.so)
/usr/lib/gcc/x86_64-linux-gnu/4.9/crtend.o
/usr/local/musl/lib/crtn.o
/usr/local/musl/lib/crt1.o
答案 0 :(得分:0)
2017年10月
一些类似的经历,也许是相关的,也许是无关的。
我遇到了同样的错误:
/usr/bin/ld: h_errno: TLS definition in //lib/i386-linux-gnu/libc.so.6 section .tbss mismatches non-TLS definition in /usr/lib/i386-linux-musl/libc.so section .bss
//lib/i386-linux-gnu/libc.so.6: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
尝试使用libz.so
关联musl-gcc
时。我的解决方案是获取zlib
源代码并使用musl-gcc
进行编译。根据{{1}}的依赖关系,您可能会遇到一些其他链接问题。
对我来说,openmp
的静态编译工作正常。我仍然需要解决一些链接问题来编译libz.a
,但我真的不需要 - libz.so
静态可执行文件比musl-gcc
静态可执行文件小8倍,并且这已经足够了。