首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC-GNAT Ada交叉编译器(Debian/glibc -> AlpineLinux/uclibc)

GCC-GNAT Ada交叉编译器(Debian/glibc -> AlpineLinux/uclibc)
EN

Stack Overflow用户
提问于 2013-08-21 07:45:06
回答 1查看 1.3K关注 0票数 1

我编写了一个GCC 4.8.1交叉编译器(构建/主机: debian/glibc,目标: alpinelinux/uclibc)。C编译器工作得很好,但是Ada现在不能工作。

代码语言:javascript
复制
juan@debian:~/HelloAda$ x86_64-alpine-linux-uclibc-gnatmake hello.adb 
x86_64-alpine-linux-uclibc-gcc -c hello.adb
x86_64-alpine-linux-uclibc-gnatbind -x hello.ali
x86_64-alpine-linux-uclibc-gnatlink hello.ali
/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/adalib/libgnat.a(adaint.o): In function `__gnat_cpu_alloc':
/home/juan/GCC/obj/gcc/ada/rts/adaint.c:3797: undefined reference to `__sched_cpualloc'
/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/adalib/libgnat.a(adaint.o): In function `__gnat_cpu_free':
/home/juan/GCC/obj/gcc/ada/rts/adaint.c:3807: undefined reference to `__sched_cpufree'
collect2: error: ld returned 1 exit status
x86_64-alpine-linux-uclibc-gnatlink: error when calling /home/juan/opt/cross/bin/x86_64-alpine-linux-uclibc-gcc
x86_64-alpine-linux-uclibc-gnatmake: *** link failed.

/home/juan/GCC/obj/gcc/ada/rts/adaint.chttp://nopaste.info/ffcb612692.html

/usr/include/sched.hhttp://nopaste.info/5332aed42a.html

/usr/include/bits/sched.hhttp://nopaste.info/46323ab5d8.html

/opt/alpine/usr/include/sched.hhttp://nopaste.info/998896bafe.html

/opt/alpine/usr/include/bits/sched.hhttp://nopaste.info/e8cfbd2844.html

有人知道吗,出什么事了?

是正在发生的事情的更详细的输出:

代码语言:javascript
复制
juan@debian:~/HelloAda$ x86_64-alpine-linux-uclibc-gcc -c hello.adb 
juan@debian:~/HelloAda$ x86_64-alpine-linux-uclibc-gnatbind hello
juan@debian:~/HelloAda$ x86_64-alpine-linux-uclibc-gnatlink -v -v hello

GNATLINK 4.8.1
Copyright (C) 1995-2013, Free Software Foundation, Inc.
x86_64-alpine-linux-uclibc-gcc -c -mtune=generic -march=x86-64 -gnatA -gnatWb -gnatiw -v -gnatws /home/juan/HelloAda/b~hello.adb
Using built-in specs.
COLLECT_GCC=/home/juan/opt/cross/bin/x86_64-alpine-linux-uclibc-gcc
Target: x86_64-alpine-linux-uclibc
Configured with: ../src/configure --prefix=/home/juan/opt/cross --build=x86_64-cross-linux-gnu --host=x86_64-cross-linux-gnu --target=x86_64-alpine-linux-uclibc --disable-altivec --disable-build-with-cxx --disable-checking --disable-fixed-point --disable-libssp --disable-libstdcxx-pch --disable-multilib --disable-nls --disable-werror --enable-languages=c,ada --enable-shared --with-dynamic-linker=ld64-uClibc.so.0.9.32 --with-dynamic-linker-prefix=/opt/alpine/lib --with-system-zlib --without-system-libunwindmake --with-sysroot=/opt/alpine
Thread model: posix
gcc version 4.8.1 (GCC) 
COLLECT_GCC_OPTIONS='-c' '-mtune=generic' '-march=x86-64' '-gnatA' '-gnatWb' '-gnatiw' '-v' '-gnatws'
 /home/juan/opt/cross/libexec/gcc/x86_64-alpine-linux-uclibc/4.8.1/gnat1 -quiet -dumpbase b~hello.adb -auxbase b~hello -mtune=generic -march=x86-64 -gnatA -gnatWb -gnatiw -gnatws /home/juan/HelloAda/b~hello.adb -o /tmp/ccG4vv8d.s
COLLECT_GCC_OPTIONS='-c' '-mtune=generic' '-march=x86-64' '-gnatA' '-gnatWb' '-gnatiw' '-v' '-gnatws'
 /home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/../../../../x86_64-alpine-linux-uclibc/bin/as -v --64 -o b~hello.o /tmp/ccG4vv8d.s
GNU assembler version 2.23.2 (x86_64-alpine-linux-uclibc) using BFD version (GNU Binutils) 2.23.2
COMPILER_PATH=/home/juan/opt/cross/libexec/gcc/x86_64-alpine-linux-uclibc/4.8.1/:/home/juan/opt/cross/libexec/gcc/x86_64-alpine-linux-uclibc/4.8.1/:/home/juan/opt/cross/libexec/gcc/x86_64-alpine-linux-uclibc/:/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/:/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/:/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/../../../../x86_64-alpine-linux-uclibc/bin/
LIBRARY_PATH=/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/:/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/../../../../x86_64-alpine-linux-uclibc/lib/../lib/:/opt/alpine/lib/../lib/:/opt/alpine/usr/lib/../lib/:/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/../../../../x86_64-alpine-linux-uclibc/lib/:/opt/alpine/lib/:/opt/alpine/usr/lib/
COLLECT_GCC_OPTIONS='-c' '-mtune=generic' '-march=x86-64' '-gnatA' '-gnatWb' '-gnatiw' '-v' '-gnatws'
/home/juan/opt/cross/bin/x86_64-alpine-linux-uclibc-gcc b~hello.o ./hello.o -v -o hello -L./ -L/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/adalib/ /home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/adalib/libgnat.a -static-libgcc
Using built-in specs.
COLLECT_GCC=/home/juan/opt/cross/bin/x86_64-alpine-linux-uclibc-gcc
COLLECT_LTO_WRAPPER=/home/juan/opt/cross/libexec/gcc/x86_64-alpine-linux-uclibc/4.8.1/lto-wrapper
Target: x86_64-alpine-linux-uclibc
Configured with: ../src/configure --prefix=/home/juan/opt/cross --build=x86_64-cross-linux-gnu --host=x86_64-cross-linux-gnu --target=x86_64-alpine-linux-uclibc --disable-altivec --disable-build-with-cxx --disable-checking --disable-fixed-point --disable-libssp --disable-libstdcxx-pch --disable-multilib --disable-nls --disable-werror --enable-languages=c,ada --enable-shared --with-dynamic-linker=ld64-uClibc.so.0.9.32 --with-dynamic-linker-prefix=/opt/alpine/lib --with-system-zlib --without-system-libunwindmake --with-sysroot=/opt/alpine
Thread model: posix
gcc version 4.8.1 (GCC) 
COMPILER_PATH=/home/juan/opt/cross/libexec/gcc/x86_64-alpine-linux-uclibc/4.8.1/:/home/juan/opt/cross/libexec/gcc/x86_64-alpine-linux-uclibc/4.8.1/:/home/juan/opt/cross/libexec/gcc/x86_64-alpine-linux-uclibc/:/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/:/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/:/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/../../../../x86_64-alpine-linux-uclibc/bin/
LIBRARY_PATH=/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/:/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/../../../../x86_64-alpine-linux-uclibc/lib/../lib/:/opt/alpine/lib/../lib/:/opt/alpine/usr/lib/../lib/:/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/../../../../x86_64-alpine-linux-uclibc/lib/:/opt/alpine/lib/:/opt/alpine/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'hello' '-L./' '-L/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/adalib/' '-static-libgcc' '-mtune=generic' '-march=x86-64'
 /home/juan/opt/cross/libexec/gcc/x86_64-alpine-linux-uclibc/4.8.1/collect2 --sysroot=/opt/alpine --eh-frame-hdr -m elf_x86_64 -dynamic-linker /opt/alpine/lib/ld64-uClibc.so.0.9.32 -o hello /opt/alpine/usr/lib/../lib/crt1.o /opt/alpine/usr/lib/../lib/crti.o /home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/crtbegin.o -L./ -L/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/adalib/ -L/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1 -L/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/../../../../x86_64-alpine-linux-uclibc/lib/../lib -L/opt/alpine/lib/../lib -L/opt/alpine/usr/lib/../lib -L/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/../../../../x86_64-alpine-linux-uclibc/lib -L/opt/alpine/lib -L/opt/alpine/usr/lib b~hello.o ./hello.o /home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/adalib/libgnat.a -lgcc -lgcc_eh -lc -lgcc -lgcc_eh /home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/crtend.o /opt/alpine/usr/lib/../lib/crtn.o
/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/adalib/libgnat.a(adaint.o): In function `__gnat_cpu_alloc':
/home/juan/GCC/obj/gcc/ada/rts/adaint.c:3797: undefined reference to `__sched_cpualloc'
/home/juan/opt/cross/lib/gcc/x86_64-alpine-linux-uclibc/4.8.1/adalib/libgnat.a(adaint.o): In function `__gnat_cpu_free':
/home/juan/GCC/obj/gcc/ada/rts/adaint.c:3807: undefined reference to `__sched_cpufree'
collect2: error: ld returned 1 exit status
x86_64-alpine-linux-uclibc-gnatlink: error when calling /home/juan/opt/cross/bin/x86_64-alpine-linux-uclibc-gcc
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-22 08:02:41

很明显,__sched_cpualloc/free*函数要么特定于Glibc 2.7,要么没有在uclibc中实现。

代码语言:javascript
复制
$ objdump -T libc.so.6 | grep __sched
000c4c30 g    DF .text  00000043  GLIBC_2.0   __sched_getparam
000c4d10 g    DF .text  00000037  GLIBC_2.0   __sched_yield
000c5540 g    DF .text  00000029  GLIBC_2.7   __sched_cpualloc
000c4d50 g    DF .text  0000003f  GLIBC_2.0   __sched_get_priority_max
000c5570 g    DF .text  00000020  GLIBC_2.7   __sched_cpufree
000c4d90 g    DF .text  0000003f  GLIBC_2.0   __sched_get_priority_min
000c5500 g   iD  .text  0000003f  GLIBC_2.6   __sched_cpucount
000c4c80 g    DF .text  00000045  GLIBC_2.0   __sched_setscheduler
000c4cd0 g    DF .text  0000003f  GLIBC_2.0   __sched_getscheduler

我猜这些是CPU并发任务所必需的。

如果您可以访问uclibc源代码,也许可以通过引用我是Glibc。来定义这些函数并重新编译库。或者更好的是,使用这两个函数创建一个小库,并在创建二进制ELF图像时将其链接起来。

事实证明,__sched_cpualloc和__sched_cpufree并不是火箭科学。下面是在Glibc中显示的代码:

代码语言:javascript
复制
9 #include <sched.h>
20 #include <stdlib.h>
21 
22 
23 cpu_set_t *
24 __sched_cpualloc (size_t count)
25 {
26   return malloc (CPU_ALLOC_SIZE (count));
27 }

代码语言:javascript
复制
23 void
24 __sched_cpufree (cpu_set_t *set)
25 {
26   free (set);
27 }

最后,CPU_ALLOC_SIZE也很简单:

代码语言:javascript
复制
165 # define __CPU_ALLOC_SIZE(count) \
166   ((((count) + __NCPUBITS - 1) / __NCPUBITS) * 8)

因此,我想您现在可以为uclibc编写自己的包装,并测试它是否有效。

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

https://stackoverflow.com/questions/18351633

复制
相关文章

相似问题

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