因此,我正在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不能容纳在自由空间中,但是如果我可以在此处获得driver / usb和drivers / input的信息,那将会有很大帮助。
如果我将链接描述文件修改为仅包含那些部分,如下所示:
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处。
谢谢!
最佳答案
如果要链接USB和直接输入,drivers/built-in.o
不应包含它们。修改Kbuild来构建子目录但不包括这些子目录有些棘手。这两个元素必须从生成obj-y
的drivers/built-in.o
中过滤掉-如果它们不包含在obj-y
中,则根本不会构建它们。
关于linux - 我如何修改vmlinux.lds来分解一个内置的.o?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21687669/