zcc编译的时候如何将指定函数链接到指定位置

尝试采取类似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选项导致的没有链接到指定位置。感谢老师的回答