尝试采取类似GCC的方法__attribute__((section(“.myitcm”))),在链接脚本里指定 .text :
{
. = ALIGN(4);
(.myitcm)
} >ITCM
发现并不会生效,是不是有其他特殊的方式设置。
我本地测试是没有问题的,可以多提供一些信息吗。
测试文件
test.c:
#include <stdio.h>
__attribute__((section(".myitcm")))
int main() {
return 0;
}
test.ld:
SECTIONS {
.text : {
. = ALIGN(4);
*(.myitcm)
}
}
测试方法
不指定链接器脚本,最后main函数会在myitcm段内,指定链接器脚本时main函数会在text段内。
$ zcc test.c
$ llvm-readelf -S a.out | grep -e text -e myitcm
[13] .text PROGBITS 0000000000001588 000588 00006e 00 AX 0 0 4
[14] .myitcm PROGBITS 00000000000015f6 0005f6 000016 00 AX 0 0 2
$ zcc test.c -T test.ld
$ llvm-readelf -S a.out | grep -e text -e myitcm
[13] .text PROGBITS 00000000000002a8 0012a8 000086 00 AX 0 0 4
$
ITCM(rwx) : ORIGIN = 0x00000000, LENGTH = 16k
.text : {
. = ALIGN(4);
*(.myitcm)
} >ITCM
这种指定一个地址能可以吗?我是这样的使用方式
也是没有问题的,可以看到产生的a.out的text段的地址已经变为了0.
$ cat test.c
#include <stdio.h>
__attribute__((section(".myitcm")))
int main() {
return 0;
}
$ cat test.ld
MEMORY
{
ITCM(rwx) : ORIGIN = 0x00000000, LENGTH = 16k
}
SECTIONS {
.text : {
. = ALIGN(4);
*(.myitcm)
} >ITCM
}
$ zcc test.c -T test.ld
$ llvm-readelf -S a.out | grep -e text -B3
Section Headers:
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[ 0] NULL 0000000000000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 0000000000000000 001000 000086 00 AX 0 0 4
$
#define IN_ITCM attribute((section(“.myitcm”)))
这是我的操作,在map文件里没有发现指定的函数被链接到指定的地方,GCC的编译编译出来后会在map文件里看到被链接到了指定的位置
可以提供完整的链接器脚本看一下吗,这种应该也是支持的
看了一下编译选项,应该是开启了-flto选项导致的没有链接到指定位置。感谢老师的回答