Tag: 符号表

C全局静态变量初始化是由链接器完成的吗?

假设我们有: 在f1.c #include static int x = 10; void f1() { printf(“f1.c : %d\n”, x); } main.c中 extern void f1(); int main(int argc, char **argv) { f1(); return 0; } 我们将编译和读取两个ELF文件符号表(rel.ELF和exec ELF): $> gcc -c *.c $> readelf -s f1.o | grep x Num: Value Size Type Bind Vis Ndx Name 5: 0000000000000000 4 OBJECT […]

符号表解析后的人口; 编译器构建

创建解析树后,我现在必须填充符号表。 我必须存储信息 标识符的类型,范围,偏移等。 现在我怎么知道标识符的类型和范围,因为我所知道的是该特定ID的词位值和行号(在词法分析之后)。 我如何得到整个事情。 谢谢。

如何从另一个模块调用导出的内核模块函数?

我正在编写一个API作为内核模块,为设备驱动程序提供各种function。 我在mycode.c中写了三个函数。 然后我构建并加载了模块,然后将mycode.h复制到 / include / linux中 。 在设备驱动程序中,我有一个#include 并调用这三个函数。 但是当我构建驱动程序模块时,我收到三个链接器警告,说明这些函数是未定义的 。 笔记: 函数在mycode.h中声明为extern 使用mycode.c中的EXPORT_SYMBOL(func_name)导出函数 运行命令nm mycode.ko显示符号表中可用的所有三个函数(它们旁边的大写字母T,表示符号在文本(代码)部分中找到) 加载模块后,命令grep func_name / proc / kallsyms将所有三个函数显示为已加载 很明显,函数正确导出,内核知道它们的位置和位置。 那么为什么司机不能看到他们的定义呢? 知道我错过了什么吗? 编辑:我在这里找到了一些相关信息: http : //www.kernel.org/doc/Documentation/kbuild/modules.txt 有时,外部模块使用来自另一个外部模块的导出符号。 kbuild需要完全了解所有符号,以避免吐出有关未定义符号的警告。 这种情况存在三种解决方案。 注意:建议使用顶级kbuild文件的方法,但在某些情况下可能不切实际。 使用顶级kbuild文件如果你有两个模块,foo.ko和bar.ko,其中foo.ko需要来自bar.ko的符号,你可以使用一个通用的顶层kbuild文件,所以这两个模块都是用同一个编译的建立。 请考虑以下目录布局: ./foo/ <= contains foo.ko ./bar/ <= contains bar.ko The top-level kbuild file would then look like: #./Kbuild (or ./Makefile): […]