GOMP без GLIBC

Я хотел бы использовать мусл с 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). Как я могу заставить мусульманин работать с OpenMP?

В настоящее время я использую Ubuntu 14.04, GCC 4.9.1, EGLIBC 2.19 на процессоре Intel(R) Xeon(R) E5-1620.

Вот то, что отправлено компоновщику, который я нашел из тега collect2 от musl-gcc -v -fopenmp omp.o, Я преобразовал большую часть пробелов в новые строки. Единственная разница между этим и делать это без -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

1 ответ

Октябрь 2017

Некоторый подобный опыт, возможно связанный, возможно не связанный.

Я получил такую ​​же ошибку:

/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 статический исполняемый файл в 8 раз меньше, чем gcc статический исполняемый файл, и это достаточно хорошо.

Другие вопросы по тегам