如何修改vmlinux.lds以拆分内置的.o?

时间:2014-02-10 19:56:13

标签: linux linker

所以我在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

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您要直接链接usb和输入,drivers/built-in.o不应包含它们。修改Kbuild来构建子目录但不包含它们有点棘手;这两个元素必须从生成obj-y的{​​{1}}过滤掉 - 如果它们未包含在drivers/built-in.o中,则根本不会构建它们。