【Linux】【开发】Linux module名和C语言文件名相同导致的编译问题

  • 🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)
  • 🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd
  • 🌐系列专栏:Linux技术
  • 📰如觉得博主文章写的不错或对你有所帮助的话,还望大家三连支持一下呀!!! 👉关注✨、点赞👍、收藏📂、评论。
  • 如需转载请参考转载须知!!

Linux module名和C语言文件名相同导致的问题

    • 问题
    • 分析
    • 解决
    • TODO

问题

  • 在基于openwrt的某系统上,编译一个内核模块my_ko,makefile内容如下:
MODULE_NAME = my_ko
$(MODULE_NAME)-y          += my_ko.o
$(MODULE_NAME)-y          += my_proc.o
obj-m := $(MODULE_NAME).o
  • 编译时报错,提示my_ko.ko中的init_func找不到。
ERROR: "xxx_func" [..../my_ko.ko] undefined!                                                                                

分析

  • 这种报错,一般表示编译模块在引用外部符号表时,没有找到指定的符号表,用到的函数找不到。但实际上,my_ko.c文件中的确定义了xxx_func函数,并且未使用任何宏控制。
    – 1、首先,通过find命令确认,my_ko.o的确生成了。
    – 2、其次,通过readelf命令,确认xxx_func的状态为UND(UND的含义是本目标文件未定义):
readelf -a my_ko.o | grep xxx_func170: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND xxx_func            

– 3、接着,在my_ko.c中随便新增了一个函数,toy_func,但是通过readelf命令发现,并没有这个符号。在my_ko.c中,增加了明显的编译错误,结果正常生成了my_ko.o。

  • 综上,可得到以下结论:生成的my_ko.o与my_ko.c并不对应,或者说, my_ko.o并不是由my_ko.c生成的。
  • 此外,通过查看.my_ko.cmd文件来看下实际的编译命令,发现在.my_ko.cmd中,没有任何gcc命令,说明gcc是上层统一执行的。
cmd_my_ko.o := arm-xxx-linux-xxx-ld -EL   -r -o my_ko.o

– 而对比以前其他编译正常的文件:

cmd_my_ko.o :=  arm-xxx-linux-xxx-gcc  -c -o my_ko.o my_ko.c
  • 因此,推测,在该编译框架下,并没有建立my_ko.o和my_ko.c的联系,而由于my_ko.c和模块名称相同,导致编译系统自行根据模块名,生成了模块对应的.o,覆盖了原来的.c所对应的.o。这点从其他模块处得到了证实,其他模块也生成了模块名对应的.o文件,但是实际上并没有对应的.c文件。

解决

  • 将模块名修改为不同于my_ko的名称后,问题得到解决。

TODO

  • Linux内核中,obj-m的模块名是和对应源文件名相同的,估计openwrt对此做了改造。
  • 关于为何生成内核模块名对应的.o,还要研究下openwrt的编译框架。有知道的可以在下方留言。

如本文对你有些许帮助,欢迎大佬支持我一下,您的支持是我持续创作的不竭动力
支持我的方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/608881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql InnoDB行锁深入理解

Record Lock记录锁 Record Lock 称为记录锁,锁住的是一条记录。而且记录锁是有 S 锁和 X 锁之分的: 当一个事务对一条记录加了 S 型记录锁后,其他事务也可以继续对该记录加 S 型记录锁(S 型与 S 锁兼容),…

物联网与智能家居:跨境电商与未来生活的融合

物联网(Internet of Things,IoT)和智能家居技术正迅速崛起,成为跨境电商领域的创新引擎。这两者的巧妙结合不仅为消费者提供更智能、便捷的生活方式,同时也为电商平台和制造商带来了全新的商机。本文将深入探讨物联网与…

Flink之Task重启策略

Task重启策略 1 策略API noRestart 无参数,task失败后不重启,整个job同时失败,默认策略. 代码示例 RestartStrategies.noRestart();fixedDelayRestart 参数注释restartAttempts最大重启次数delayBetweenAttempts重启时间间隔代码示例 // 最多重启5次,每次任务失败后间隔1s重启…

记录实现级联选择器多选功能时主要用到的函数

级联选择器多选功能时主要用到的函数 1、校验所给层级是否有效并且是否为完整路径 // 功能:涉及到级联选择器回显时,需校验是否为完整的路径,是则回显,不是则无无效路径 // options为级联数据,selectedPaths为要校验…

C++模板——(3)类模板

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 勤奋,机会,乐观…

使用pyinstaller打包生成exe(解决gradio程序的打包问题)

解决 [Errno 2] No such file or directory: gradio_client\types.json 问题,不需要手动创建hook文件 解决 FileNotFoundError: [Errno 2] No such file or directory: gradio\blocks_events.pyc 问题,不需要将pyi文件重命名为pyc文件 最终实现gradio程…

卡码网Java基础课 | 7. 摆平积木,8. 奇怪的信

卡码网Java基础课|7. 摆平积木 7. 摆平积木8. 奇怪的信 7. 摆平积木 import java.util.Scanner; import java.util.ArrayList;public class Main{public static void main(String[] args){Scanner sc new Scanner(System.in);while(sc.hasNextInt()){int n sc.nextInt();if(…

【CSS】讲一讲BFC、IFC、GFC、FFC

1. 前言 FC(Formatting Contexts),是CSS2.1的一个概念,是页面中的一块渲染区域,具有一套渲染规则,决定FC中子元素如何定位,以及和其他元素的关系和相互作用。在说FC之前说一下文档流。 1.1. 普…

手撕 PCA

PCA(Principal Component Analysis),中文名称:主成分分析。迄今为止最流行的降维算法。 假设 n 维空间中的一个单位立方体,易知:一维空间中该立方体中任意两点的距离不超过 1 1 1,二维空间中该…

自动连接校园网(河海大学)

layout: post # 使用的布局(不需要改) title: 自动连接校园网(河海大学) # 标题 subtitle: 网络 #副标题 date: 2024-01-09 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背景图片 catal…

GAMES101-Assignment4

一、问题总览 实现de Casteljau算法来绘制由4个控制点表示的Bzier曲线。需要修改main.cpp中的如下函数: bezier:该函数实现绘制Bzier曲线的功能。它使用一个控制点序列和一个OpenCV::Mat对象作为输入,没有返回值。它会使t在0到1的范围内进行…

Python采集微博评论做词云图

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用: Python 3.10 Pycharm 第三方模块使用: import requests >>> pip install requests import wordcloud >>> pip install wordclou…

扩展学习|数据融合助推商务智能与分析

文献来源:[1]李爱华,续维佳,石勇.基于数据融合的商务智能与分析架构研究[J].计算机科学,2022,49(12):185-194. 一、信息融合 (一)信息融合定义演变 早期信息融合的定义指出,其主要任务是综合分析若干传感器观测到的信息[9,…

请求参数乱码问题

POST请求方式解决乱码问题 在web.xml里面设置编码过滤器 <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!-- 设置过滤器中的属性值 -…

Python面试题(基础篇)

题目001: 在Python中如何实现单例模式。 点评&#xff1a;单例模式是指让一个类只能创建出唯一的实例&#xff0c;这个题目在面试中出现的频率极高&#xff0c;因为它考察的不仅仅是单例模式&#xff0c;更是对Python语言到底掌握到何种程度&#xff0c;建议大家用装饰器和元类…

微信小程序canvas画布实现矩形元素自由缩放、移动功能

获取画布信息并绘制背景 .whml <canvas class="canvas" type="2d" id="myCanvas" bindtouchstart="get_rect_touch_position" bindtouchmove="move_or_scale" bind:tap="finish_edit_check"/> .wxss .c…

【案例实战】业务稳定性运行之全链路混合压测

1.全链路压测开展步骤 &#xff08;1&#xff09;什么是全链路压测 全链路压测是指基于真实业务场景&#xff0c;通过模拟海量的用户请求&#xff0c;对整个后台服务进行压力测试&#xff0c;从而评估整个系统的性能水平。 对应用程序的整个技术栈进行完整的压力和性能测试&a…

DataFrame相关的API

目录 DataFrame的操作方案 SQL相关的API 创建一个视图/表 DSL相关的API DSL的传递方式 SQL的函数库 Spark SQL的综合应用 直接基于DataFrame来处理 SQL方式 DSL方式 基于RDD转换DataFrame的方式 DataFrame的操作方案 操作DataFrame一般有两种操作方案:一种为DSL方式,一种…

关于24年信息系统项目管理师论文如何提升?

信息系统项目管理师论文满分是75分&#xff0c;45分及以上为及格&#xff0c;论文评分可分为优良、及格与不及格3个档次。 评分的分数可分为&#xff1a; &#xff08;1&#xff09;60分至75分优良&#xff08;相当于百分制80分至100分&#xff09;。 &#xff08;2&#xf…