Compilation 使用大量源文件编译外部内核模块

Compilation 使用大量源文件编译外部内核模块,compilation,linux-kernel,Compilation,Linux Kernel,我是Linux内核的新手 编译内核模块时,我遇到以下问题: make[3]: execvp: /bin/sh: Argument list too long 追踪问题,我发现问题在于链接(ld)模块时。 我的模块由许多文件组成,而模块源位于长度为60个字符的路径下。我看到ld使用对象文件的绝对路径 我不太熟悉我的构建系统,但据我所知,我们使用相对路径添加到了obj-m*.c文件 有什么想法吗?很奇怪,你的内核模块这么大,由这么多文件组成。传统智慧是使用小型内核模块(可能与外部用户空间助手程序通

我是Linux内核的新手

编译内核模块时,我遇到以下问题:

make[3]: execvp: /bin/sh: Argument list too long
追踪问题,我发现问题在于链接(ld)模块时。 我的模块由许多文件组成,而模块源位于长度为60个字符的路径下。我看到ld使用对象文件的绝对路径

我不太熟悉我的构建系统,但据我所知,我们使用相对路径添加到了obj-m*.c文件


有什么想法吗?

很奇怪,你的内核模块这么大,由这么多文件组成。传统智慧是使用小型内核模块(可能与外部用户空间助手程序通信)。你确定你的软件架构设计吗

回到问题,您可以将
gcc
的所有参数放在一个类似
my.args
的文件中,只需使用
gcc@my.args
调用
gcc
,因为
gcc
专门处理
@


您还可以重新编译内核,并适当增加文件
include/linux/limits.h
ARG\u MAX
\define
。我经常将其定义为2兆字节,即
(2很奇怪,您的内核模块如此之大,由如此多的文件组成。传统的做法是使用小型内核模块(可能与外部用户空间帮助程序通信)。您确定您的软件体系结构设计吗

回到问题,您可以将
gcc
的所有参数放在一个类似
my.args
的文件中,只需使用
gcc@my.args
调用
gcc
,因为
gcc
专门处理
@


您还可以重新编译内核,并适当地增加文件
include/linux/limits.h中
ARG_MAX
#define
。我通常将其定义为2兆字节(即
(2不确定这是怎么回事,但如果问题是路径太长,一个解决方案是制作一个符号链接并使用它。是否可以将构建更改为更小的静态库,然后将它们链接在一起形成模块?@Joachim Pileborg是否可以使用kbuild?@Pithikos符号链接也没有帮助-我看到ld仍然是uses绝对路径。不确定这是关于什么的,但如果问题是路径太长,一个解决方案是制作一个符号链接并使用它。是否可以将构建更改为更小的静态库,然后将它们链接在一起形成模块?@Joachim Pileborg是否可以使用kbuild?@Pithikos符号链接也没有帮助-我看到ld仍然使用kbuild文件支持的绝对路径.gcc@my.args?这是
gcc
本身的一个功能,而不是构建系统的一个功能。这是一个不错的功能,但我需要一个kbuild的解决方案。我担心增加ARG_MAX不是一个选项。kbuild文件支持的gcc@my.args?这是
gcc
本身的一个功能,而不是构建系统的一个功能。很好功能,但我需要一个用于kbuild的解决方案。恐怕不能增加ARG_MAX。