#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没有任何链接器问题。
1条答案
按热度按时间eanckbw91#
从ioperm手册页:
“此调用主要用于i386体系结构。在许多其他体系结构上,它不存在或总是返回错误。”
glibc在2.30之前的实现,用代码的话来说,是“虚构的”,之后就不存在了。
基本上,除非你在32位x86上,否则不要使用ioperm()和朋友。