所以我在NXP LPC1788处理器(ARM-CortexM3,没有MMU)下使用ucLinux。 ucLinux端口由Emcraft Systems公司完成。
1788具有512KiB的板载闪存(称为eNVM),其访问速度比通过外部存储器控制器连接的其余存储器更快。 Emcraft的链接描述文件中有一部分可以将内核的关键部分重定位到此eNVM区域。我使用80K作为引导加载程序,所以我有432K可以自由地使用尽可能多的内核。
因此,链接描述文件vmlinux.lds.S的部分开头如下:
#ifdef CONFIG_KERNEL_IN_ENVM
_envm_loc = .;
.envm ENVM_PHYS_OFFSET + CONFIG_KERNEL_IN_ENVM_OFFSET * 1024 : {
_envm_start = .;
#if CONFIG_KERNEL_IN_ENVM_SIZE>0
__exception_text_start = .;
*(.exception.text*)
*(.exception.rodata*)
__exception_text_end = .;
SCHED_TEXT
LOCK_TEXT
KPROBES_TEXT
usr/built-in.o(.text)
usr/built-in.o(.rodata*)
init/built-in.o(.text)
init/built-in.o(.rodata*)
mm/built-in.o(.text)
mm/built-in.o(.rodata*)
......等等。如您所见,整个子目录通过其内置的.o对象文件被拉入。
当我越来越接近闪存空间的末尾时,我想对这里链接的内容有更多的控制权。例如,drivers / built-in.o不适合自由空间,但如果我可以在这里获得驱动程序/ usb和驱动程序/输入,那将会有很大帮助。
如果我修改链接描述文件只包含那些部分,如下所示:
drivers/usb/built-in.o(.text)
drivers/usb/built-in.o(.rodata*)
drivers/input/built-in.o(.text)
drivers/input/built-in.o(.rodata*)
然后当drivers / built-in.o被链接时,我得到重复的符号错误。我无法确切地看到它发生在哪里,所以这是我认为的问题的一部分。
所以问题是:有没有办法将各个内置的.o文件链接到不同的区域而不链接在目录顶部构建的主.o文件?
如果有人想看一下,我已将整个链接器文件放在http://pastebin.com/qcj6rHme。
谢谢!
答案 0 :(得分:0)
如果您要直接链接usb和输入,drivers/built-in.o
不应包含它们。修改Kbuild来构建子目录但不包含它们有点棘手;这两个元素必须从生成obj-y
的{{1}}过滤掉 - 如果它们未包含在drivers/built-in.o
中,则根本不会构建它们。