【问题标题】:GCC-GNAT Ada Cross-Compiler (Debian/glibc -> AlpineLinux/uclibc)GCC-GNAT Ada 交叉编译器 (Debian/glibc -> AlpineLinux/uclibc)
【发布时间】:2013-08-21 07:45:06
【问题描述】:

我编译了一个 GCC 4.8.1 交叉编译器(BUILD/HOST:debian/glibc,TARGET:alpinelinux/uclibc)。 C 编译器运行良好,但 Ada 暂时无法运行。

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

有人知道,出了什么问题吗?

更详细的输出:

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

【问题讨论】:

  • 这有点猜想:您的 alpine adainit.c 的 adainit 在哪里?看起来它正在寻找 gcc 一个(它没有 __sched_cpu* 方法),而 alpine 一个会/应该。您可能必须明确告诉 alpine-gnatmake 在 GCC 之前查看这些(高山)目录。 (或者我的猜测是错误的:()
  • 感谢您的意见。在 adaint.c 中,第 3785 行有一个 #include 。所以,它包含了错误的 sched.h?
  • 这将是我的结论(我在工作,所以不能在闲暇时检查您的所有链接),查看 gnatmake 的帮助(只需键入不带任何 args 的 gnatmake)并查看如何在之前显式包含目录默认的。
  • 嗨,我尝试了一些参数。但是我总是遇到与我的条目相同的错误。如果你在家里,你能找到吗?
  • 抱歉,我不会安装 AlpineLinux。我的帮助只能到此为止。对不起。

标签: gcc debian cross-compiling ada uclibc


【解决方案1】:

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

$ 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 here. 来定义这些函数并重新编译库。或者更好的是,只需使用这两个函数创建一个小型库,并在创建二进制 ELF 图像时链接它。

__sched_cpualloc 和 __sched_cpufree 不是火箭科学,事实证明。以下是 Glibc 中的代码:

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 }

23 void
24 __sched_cpufree (cpu_set_t *set)
25 {
26   free (set);
27 }

最后,CPU_ALLOC_SIZE 也很简单:

165 # define __CPU_ALLOC_SIZE(count) \
166   ((((count) + __NCPUBITS - 1) / __NCPUBITS) * 8)

所以我想你现在可以为 uclibc 编写自己的包装器并测试它是否有效。

【讨论】:

  • 呃,我的英语很糟糕。
  • 您只需复制/粘贴我编写的内容并将其编译到一个小型静态库中,您可以在最后阶段将其与您的主要二进制 ELF 映像链接。我不明白为什么它不起作用,但请随时更新我的​​任何错误。
  • 嗯...您删除了个人资料名称。我猜你放弃了这个问题?
  • 不,我没有;)请问,您是 Ada 专家吗?
  • 但多亏了你的帮助,我终于让它工作了 :-) 我认为,gnatmake 总是使用错误的 sched.h。
猜你喜欢
  • 2012-08-13
  • 1970-01-01
  • 2021-02-10
  • 2011-05-20
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多