首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GOMP无GLIBC

GOMP无GLIBC
EN

Stack Overflow用户
提问于 2014-10-13 12:23:13
回答 1查看 1.2K关注 0票数 1

我想将http://www.musl-libc.org/与OpenMP结合使用。但是,当我编译一个简单的OpenMP程序时,例如

代码语言:javascript
复制
int main() {
    int i;
    #pragma omp parallel for
    for(i=0; i<100; i++) {
        printf("asdf\n");
    }
}

使用

代码语言:javascript
复制
musl-gcc -fopenmp foo.c

我知道错误了

代码语言:javascript
复制
/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一起工作?

我目前使用的Ubuntu 14.04,GCC 4.9.1,EGLIBC 2.19,在英特尔(R) Xeon(R) CPU E5-1620。

下面是发送给链接器的内容,我从collect2标记musl-gcc -v -fopenmp omp.o中找到了这个链接器。我把大部分空格转换成换行符。这与不使用-fopenmp选项执行此操作之间的唯一区别是添加了pthreadgomp

代码语言:javascript
复制
-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的输出

代码语言:javascript
复制
/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
EN

回答 1

Stack Overflow用户

发布于 2017-10-12 22:59:28

2017年10月

一些类似的经历,也许是相关的,也许是无关的。

我也犯了同样的错误:

代码语言:javascript
复制
/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编译它。根据openmp的依赖关系,您可能会遇到一些额外的链接问题。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26339936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档