1

我想将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。

这是我从 collect2 标记中找到的发送到链接器的内容musl-gcc -v -fopenmp omp.o。我将大部分空格转换为换行符。这样做与没有选项的唯一区别-fopenmp是添加了pthreadand 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
4

1 回答 1

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.somusl-gcc。我的解决方案是获取zlib源代码并使用musl-gcc. 您可能会遇到一些额外的链接问题,具体取决于openmp.

对我来说,静态编译libz.a工作正常。我仍然需要解决一些链接问题来编译 a libz.so,但我真的不需要 -musl-gcc静态可执行文件比gcc静态可执行文件小 8 倍,这就足够了。

于 2017-10-12T22:59:28.110 回答