gpt4 book ai didi

linux - 如何修改 vmlinux.lds 来分解内置的 .o?

转载 作者:太空宇宙 更新时间:2023-11-04 04:04:45 25 4
gpt4 key购买 nike

所以我在 NXP LPC1788 处理器(ARM-CortexM3,无 MMU)下使用 ucLinux。 ucLinux 移植最初是由 Emcraft Systems 完成的。

1788 具有 512KiB 板载闪存(称为 eNVM),其访问速度比通过外部内存 Controller 连接的其余内存更快。 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 不适合可用空间,但如果我可以在这里获取 drivers/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 链接时,我收到重复的符号错误。我看不出到底发生在哪里,所以我认为这就是问题的一部分。

所以问题是:有没有一种方法可以将各个built-in.o 文件链接到不同的区域,而不链接在目录顶部构建的主.o ?

我已将整个链接器文件放在 http://pastebin.com/qcj6rHme 处如果有人想看一下。

谢谢!

最佳答案

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com