因此,我正在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-ydrivers/built-in.o中过滤掉-如果它们不包含在obj-y中,则根本不会构建它们。

关于linux - 我如何修改vmlinux.lds来分解一个内置的.o?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21687669/

10-11 22:54