【问题标题】:Undefined reference to -finstrument-functions对 -finstrument-functions 的未定义引用
【发布时间】: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


【解决方案1】:

你是否也在头文件中输入了 __cyg_profile_func_enter 和 __cyg_profile_func_exit 的条目。如果没有,请在头文件中声明这些函数并确保该模块正在编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2013-02-26
    • 2012-04-09
    • 1970-01-01
    • 2011-03-27
    • 2022-01-22
    • 2016-04-04
    相关资源
    最近更新 更多