【发布时间】:2017-01-21 06:23:32
【问题描述】:
我正在尝试跟踪内核函数,并且我正在使用 -finstrument-functions 来执行此操作,但我得到如下未定义的引用错误:
arch/arm/kernel/elf.c:9: undefined reference to `__cyg_profile_func_enter'
arch/arm/kernel/elf.c:13: undefined reference to `__cyg_profile_func_exit'
arch/arm/kernel/built-in.o: In function `elf_set_personality':
arch/arm/kernel/elf.c:42: undefined reference to `__cyg_profile_func_enter'
arch/arm/kernel/elf.c:75: undefined reference to `__cyg_profile_func_exit'
drivers 中还有更多与上述类似的错误。
我已导出 __cyg_profile_func_enter 和 __cyg_profile_func_exit 符号,但我仍然收到此错误。我使用linux 4.1 kernel 和手臂板。
【问题讨论】:
-
您是否在代码中定义
__cyg_profile_func_enter和__cyg_profile_func_exit函数?如果有,在哪里? -
@duskwuff 是的,我已经在
kernel/trace/myfile.c中定义了它,但我没有在上述库中将它们声明为extern,因为它们有数千个,我无法插入每个库。有没有办法在一个extern语句中做到这一点,如果可能的话,我应该在哪里添加它? -
extern是一个声明,但错误消息undefined reference表示缺少定义。检查kernel/trace/myfile.c是否实际被编译,并且被编译进入内核 (obj-y),而不是作为模块(obj-m)。 -
@Tsyvarev 在makefile中,我编译为
obj-(CONFIG_MYCODE),设置为y -
尽可能简化代码:在 Makefile 中使用普通的
obj-y,在kernel/trace/myfile.c中以最简单的形式定义给定函数:不使用宏和#ifdefs。检查您的 makefile 是否已实际处理(配置CONFIG_FUNCTION_TRACER应为“开启”)。如果没有任何帮助,请以最简单的形式发布您的代码。
标签: linux gcc linux-kernel arm linux-device-driver