为什么arm-poky-linux-gnueabi-gcc链接器不使用它在C库上找到的符号的定义?

c7rzv4ha  于 8个月前  发布在  Linux
关注(0)|答案(1)|浏览(70)
#include<stdio.h>
//#include<sys/io.h>
extern        int ioperm(unsigned long from, unsigned long num, int turn_on);
int main()

{
 unsigned long from, num;
  int turn_on;
 ioperm( from,num,  turn_on);
 return 0;
}

字符串
当我使用
第一个月
输出看起来像
<$PWD>/sdk/sysroots/armv7ahf-neon-poky-linux-gnueabi/lib/libc.so.6: definition of ioperm
hello.o:hello.c:function main: error: undefined reference to 'ioperm'
那么,链接器也找到了这个符号,但是不能使用它?为什么?
如果我看到这个库上的dyn-syms,它是如下所示:
arm-poky-linux-gnueabi-readelf --dyn-syms <$PWD>/sdk/sysroots/armv7ahf-neon-poky-linux-gnueabi/lib/libc-2.31.so | grep ioperm 437: 000d4cf0 32 FUNC GLOBAL DEFAULT 13 ioperm@GLIBC_2.4
使用的gcc版本是 gcc版本9.3.0(GCC)
我有另一个开放的嵌入式arm工具链,其中gcc编译器是 arm-oe-linux-gnueabi-gcc。它的版本是 6.4.0,其中glibc是 * libc-2.26.so *,符号被定义为418: 000dfcd8 396 FUNC WEAK DEFAULT 11 ioperm@@GLIBC_2.4在这个开放的嵌入式工具链中,符号被正确链接。我如何从链接器获得更多信息,了解为什么它没有使用yocto工具链中的符号定义?此外,在yocto工具链中,此符号未在任何地方声明为头文件<sys/io.h>我想知道为什么glibc说定义被找到了,即使头甚至不存在?
另外,在yocto工具链上,只有这个符号会导致问题。其他C语言的summer没有任何链接器问题。

eanckbw9

eanckbw91#

从ioperm手册页:
“此调用主要用于i386体系结构。在许多其他体系结构上,它不存在或总是返回错误。”
glibc在2.30之前的实现,用代码的话来说,是“虚构的”,之后就不存在了。
基本上,除非你在32位x86上,否则不要使用ioperm()和朋友。

相关问题