OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11540|回复: 12

字符设备驱动编译出现error:code model kernel does not support PIC mode

[复制链接]

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-4-13
在线时间
11 小时
发表于 2019-11-13 08:38:46 | 显示全部楼层 |阅读模式
5金钱
Deal all,字符设备驱动make -j32出现 error:code model kernel does not support PIC mode.
环境:Ubuntu 18.04
arm-linux-guneabihf-gcc:  version 4.9.4(Linaro GCC 4.9-2017.01)
内核源码:正点原子修改后的:linux-imx-4.1.15-2.1.0-g49efdaa-v1.0.tar.bz2


前提:内核源码编译内核成功:Kernel: arch/arm/boot/zImage is ready

字符设备驱动源码:拷贝例程源码\2、Linux驱动例程\1_chrdevbase,
并修改VScode工程中自己的源码路径和Makefile路径

            "includePath": [
                "${workspaceFolder}/**",
                "/home/wjj/Documents/opendev/linux-imx-4.1.15-alpha/include",
                "/home/wjj/Documents/opendev/linux-imx-4.1.15-alpha/arch/arm/include",
                "/home/wjj/Documents/opendev/linux-imx-4.1.15-alpha/arch/arm/include/generated/"



KERNELDIR := /home/wjj/Documents/opendev/linux-imx-4.1.15-alpha


在1_chrdevbase目录下make -j32,出现下述错误。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
make -C /home/wjj/Documents/opendev/linux-imx-4.1.15-alpha M=/home/wjj/Documents/opendev/LinuxDrivers/1_chrdevbase modules
make[1]: Entering directory '/home/wjj/Documents/opendev/linux-imx-4.1.15-alpha'
  CC [M]  /home/wjj/Documents/opendev/LinuxDrivers/1_chrdevbase/chrdevbase.o
cc1: error: code model kernel does not support PIC mode
scripts/Makefile.build:264: recipe for target '/home/wjj/Documents/opendev/LinuxDrivers/1_chrdevbase/chrdevbase.o' failed
make[2]: *** [/home/wjj/Documents/opendev/LinuxDrivers/1_chrdevbase/chrdevbase.o] Error 1
Makefile:1384: recipe for target '_module_/home/wjj/Documents/opendev/LinuxDrivers/1_chrdevbase' failed
make[1]: *** [_module_/home/wjj/Documents/opendev/LinuxDrivers/1_chrdevbase] Error 2
make[1]: Leaving directory '/home/wjj/Documents/opendev/linux-imx-4.1.15-alpha'
Makefile:9: recipe for target 'kernel_modules' failed
make: *** [kernel_modules] Error 2

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

尝试解决:参考https://blog.csdn.net/jasonLee_lijiaqi/article/details/84651138中在内核源码的顶层Makefile做如下修改:在KBUILD_CFLAGS尾部添加 -fno-pie

添加后出现了更多的error:
evbase.c:2:
./arch/x86/include/asm/arch_hweight.h: In function ‘__arch_hweight64’:
./arch/x86/include/asm/arch_hweight.h:53:42: error: expected ‘:’ or ‘)’ before ‘POPCNT64’
  asm (ALTERNATIVE("call __sw_hweight64", POPCNT64, X86_FEATURE_POPCNT)

........
error: unknown type name ‘atomic64_t’; did you mean ‘atomic_t’?
static inline void atomic64_set(atomic64_t *v, long i)

-----------------------------------------------------------------------------

请教论坛大神,这类问题接下来要如何解决?
Linux源码Makefile添加-fno-pie后再重新编译内核吗?






最佳答案

查看完整内容[请看2#楼]

问题解决:https://e2e.ti.com/support/processors/f/791/t/737467 需要使用make ARCH=arm CROSS_COMPILE = arm-linux-gnueabihf-gcc 按照手册中直接输入make -j32编译可能有问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-4-13
在线时间
11 小时
 楼主| 发表于 2019-11-13 08:38:47 | 显示全部楼层
本帖最后由 544571980@qq.com 于 2019-11-25 13:13 编辑

问题解决:https://e2e.ti.com/support/processors/f/791/t/737467

需要使用make ARCH=arm  CROSS_COMPILE = arm-linux-gnueabihf-gcc
按照手册中直接输入make -j32编译可能有问题。
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2017-4-22
在线时间
13 小时
发表于 2019-11-25 11:35:09 | 显示全部楼层
你好,楼主我跟你遇到了同样的问题,那个PIC mode的解决办法与你提到的解决方法一样,解决该问题后编译也是出现了更多的error提示,尝试用make ARCH=arm  CROSS_COMPLIE = arm-linux-gnueabihf-  编译还是没有解决该问题啊,提示没有编译目标,你的问题解决了吗?请教一下是怎么解决的呢?万分感谢!
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2017-4-22
在线时间
13 小时
发表于 2019-11-25 12:52:33 | 显示全部楼层
TIM图片20191125113714.png 对上面问题的图片补充,添加make ARCH=arm  CROSS_COMPLIE = arm-linux-gnueabihf-  编译报错“空变量名,停止”
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-4-13
在线时间
11 小时
 楼主| 发表于 2019-11-25 13:12:33 | 显示全部楼层
本帖最后由 544571980@qq.com 于 2019-11-25 13:23 编辑
xiaoshuai5588 发表于 2019-11-25 12:52
对上面问题的图片补充,添加make ARCH=arm  CROSS_COMPLIE = arm-linux-gnueabihf-  编译报错“空变量名, ...

编译的时候:输入如下命令
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
回复

使用道具 举报

9

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2019-10-29
在线时间
25 小时
发表于 2019-11-26 10:02:06 | 显示全部楼层
我编译驱动时也出现过问题,弄了很久,现在没有问题了,你可以试试
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
然后再make
回复

使用道具 举报

9

主题

890

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2390
金钱
2390
注册时间
2019-9-25
在线时间
397 小时
发表于 2019-11-29 23:47:38 | 显示全部楼层
本帖最后由 仰望星空之云 于 2019-11-30 12:40 编辑

像教程那样在Makefile下配置,指定 ARCH=arm ,编译器为arm-linux-gnueabihf-了以后再直接make就好了。应该是你的源码根目录下的Makefile没指定,系统会默认调用别的编译器才导致的错误
回复

使用道具 举报

13

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2016-6-20
在线时间
121 小时
发表于 2019-12-9 21:50:43 | 显示全部楼层
xiaoshuai5588 发表于 2019-11-25 12:52
对上面问题的图片补充,添加make ARCH=arm  CROSS_COMPLIE = arm-linux-gnueabihf-  编译报错“空变量名, ...

CROSS_COMPLIE = arm-linux-gnueabihf

不应该有空格就对了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2020-3-6
在线时间
1 小时
发表于 2020-3-6 13:55:59 | 显示全部楼层
糊涂仙 发表于 2019-11-26 10:02
我编译驱动时也出现过问题,弄了很久,现在没有问题了,你可以试试
export ARCH=arm
export CROSS_COMPI ...

可以:
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2020-11-8
在线时间
0 小时
发表于 2020-11-8 12:27:40 | 显示全部楼层
糊涂仙 发表于 2019-11-26 10:02
我编译驱动时也出现过问题,弄了很久,现在没有问题了,你可以试试
export ARCH=arm
export CROSS_COMPI ...

有效!!!!!!!!
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2022-6-5
在线时间
7 小时
发表于 2022-6-7 17:16:36 | 显示全部楼层
2022_6_7 我也遇到了这个问题
总结一下有两种解决方案:
第一种:像5楼说的那样,在make时指定编译器,注意等号两侧不要有空格。即执行 “make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-”
第二种:7楼的方法,直接修改内核源码第252、253行,改为
ARCH                ?= arm
CROSS_COMPILE        ?= arm-linux-gnueabihf-
然后直接执行“make”

根本原因正如7楼所言,内核源码根目录下的Makefile没指定,系统会默认调用别的编译器才导致的错误
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2016-4-9
在线时间
3 小时
发表于 2022-6-14 20:37:10 | 显示全部楼层
地理课代表 发表于 2022-6-7 17:16
2022_6_7 我也遇到了这个问题
总结一下有两种解决方案:
第一种:像5楼说的那样,在make时指定编译器,注 ...

由于偷懒,直接复制了资料里边的源码进行编译,出现了同样的情况,看了这篇帖子后,执行 “make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-”就可以编译成功了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2023-8-28
在线时间
2 小时
发表于 2023-8-29 17:57:11 | 显示全部楼层
糊涂仙 发表于 2019-11-26 10:02
我编译驱动时也出现过问题,弄了很久,现在没有问题了,你可以试试
export ARCH=arm
export CROSS_COMPI ...

可以了 感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 01:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表