库中的.text、.data、.bss .a 文件可以分成单独的部分吗

can .text, .data, .bss from a library .a file be separated into separate sections

我的问题是在链接描述文件中定位库 .a 文件。正常的链接描述文件由 .text、.data、.rodata 和 .bss 部分组成。

.text :
{
    *(.text .text.*)
    *(.rodata .rodata*)  /* global const uint32_t i = 10 for example */
} > rom

.data :
{
    *(.data .data.*)
} > ram AT > rom

.bss (NOLOAD) :
{
    *(.bss .bss.*)  
} > ram

我想知道的是 libc.a 等库中的 .text、.data、.rodata 和 .bss 部分是否可以与其他部分分开放置?将 .text 放在不同的区域是通过 *\libc.a:* 完成的,但是 .data、.rodata 和 .bss 如何重新定位?

.text1 :
{
    *\libc.a:* //.text from libc.a is placed into rom1 instead of rom 
} > rom1

我预计放置 .data、.rodata 和 .bss 的答案可能具有类似的语法,但下面的语法是错误的,因为 libc.a 部分仍在 ram 和 rom 而不是 ram1 和 rom1。

.text1 :
{
    *\libc.a:*(.text .text.*)     // libc.a.text still resides in rom
    *\libc.a:*(.rodata .rodata.*) // libc.a.rodata still resides in rom
} > rom1

.data1 :
{
    *\libc.a:*(.data .data.*)    // libc.a.data still resides in ram
} > ram1 AT > rom1

.bss1 (NOLOAD) :
{
    *\libc.a:*(.bss .bss.*)      // libc.a.bss still resides in ram
} > ram1

是否有任何提示可以将 .a 文件中的 .data、.rodata 和 .bss 分成各自的部分?

这取决于您构建库的方式或是否重新链接它。您可以通过直接构建 libc 或首先使用中间链接器脚本重新链接目标文件来命名这些部分。text.libc.*。

*\libc.a: ... 语法我相信只有当您使用 libc.a.

中所有文件的实际 *.o 名称时才有效

注意:Gcc 也有一些选项可以自动将代码放入子部分,比如每个函数一个部分。注意不要让事情与那个不兼容。