Gcc RISC-V:未链接的对象文件中的代码大小
我有一个.I文件,我已编译,但未使用SiFive risc-v编译器链接,如下所示: ../riscv64-unknown-elf-gcc-8.2.0-2019.05.3-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-gcc clock.i 但是,当我对编译的对象文件执行readelf-S时,.text部分为0字节:Gcc RISC-V:未链接的对象文件中的代码大小,gcc,elf,riscv,object-files,readelf,Gcc,Elf,Riscv,Object Files,Readelf,我有一个.I文件,我已编译,但未使用SiFive risc-v编译器链接,如下所示: ../riscv64-unknown-elf-gcc-8.2.0-2019.05.3-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-gcc clock.i 但是,当我对编译的对象文件执行readelf-S时,.text部分为0字节: Section Headers: [Nr] Name Type Addr
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 00000000 000034 000000 00 AX 0 0 2
[ 2] .data PROGBITS 00000000 000034 000000 00 WA 0 0 1
[ 3] .bss NOBITS 00000000 000034 000000 00 WA 0 0 1
[ 4] .text.getTime PROGBITS 00000000 000034 00003a 00 AX 0 0 2
[ 5] .rela.text.ge RELA 00000000 000484 0000c0 0c I 18 4 4
[ 6] .text.timeGap PROGBITS 00000000 00006e 00002e 00 AX 0 0 2
[ 7] .rela.text.ti RELA 00000000 000544 000024 0c I 18 6 4
[ 8] .text.applyTO PROGBITS 00000000 00009c 000038 00 AX 0 0 2
[ 9] .rela.text.ap RELA 00000000 000568 0000c0 0c I 18 8 4
[10] .text.clearTO PROGBITS 00000000 0000d4 000038 00 AX 0 0 2
[11] .rela.text.cl RELA 00000000 000628 0000c0 0c I 18 10 4
[12] .rodata.getTi PROGBITS 00000000 00010c 00000c 01 AMS 0 0 4
[13] .rodata.__func__. PROGBITS 00000000 000118 00000c 00 A 0 0 4
[14] .rodata.__func__. PROGBITS 00000000 000124 00000c 00 A 0 0 4
[15] .rodata.__func__. PROGBITS 00000000 000130 00000c 00 A 0 0 4
[16] .comment PROGBITS 00000000 00013c 000029 01 MS 0 0 1
[17] .riscv.attributes LOPROC+0x3 00000000 000165 00001f 00 0 0 1
[18] .symtab SYMTAB 00000000 000184 000240 10 19 31 4
[19] .strtab STRTAB 00000000 0003c4 0000be 00 0 0 1
[20] .shstrtab STRTAB 00000000 0006e8 000100 00 0 0 1
如果对编译的对象文件进行大小调整,则得到的大小为264字节:
text data bss dec hex filename
264 0 0 264 108 clock.o
如果我使用nm——打印尺寸,我会得到以下结果:
U __assert_func
00000000 0000000c r __func__.3507
00000000 0000000c r __func__.3518
00000000 0000000c r __func__.3522
0000000c t .L11
00000036 t .L12
00000034 t .L14
00000036 t .L18
00000034 t .L2
00000034 t .L20
00000032 t .L3
0000001e t .L8
00000000 r .LANCHOR0
00000000 r .LANCHOR1
00000000 r .LANCHOR2
00000000 r .LC0
00000004 r .LC1
00000000 00000038 T applyTO
00000000 00000038 T clearTO
00000000 0000003a T getTime
00000000 0000002e T timeGap
对我来说,大小应该是0x38+0x38+0x3A+0x2E=0xD8(216)字节
如何计算已编译对象文件的大小?您的对象文件是使用
-fffunction sections
编译的,这是一个特殊标志,用于将每个函数分配给其专用部分。您可以在readelf
的输出中看到每个函数的单个.text
:
[ 4] .text.getTime PROGBITS 00000000 000034 00003a 00 AX 0 0 2
...
[ 6] .text.timeGap PROGBITS 00000000 00006e 00002e 00 AX 0 0 2
...
要获得完整的代码大小,您需要以“.text”开头的每个部分的大小总和。Perl单行程序:
$ readelf ... | perl -ne 'if(/ \.text/) { s/^.*\] *//; $sz += hex((split(/ +/))[4]); print "$sz\n"; }' 0
58
104
160
216 <-- Full size
$readelf…|perl-ne'if(/\.text/){s/^.*]*/;$sz+=hex((split(+/)[4]);打印“$sz\n”;}”0
58
104
160
216我想你也需要求和.rodata*
.text
此处为零,因此可以省略。大小-时钟.o
应该显示大部分或所有部分。似乎大小-A不包括rodata或eh_框架谢谢你的回答,这很有意义,还有一个问题是为什么大小给我的值稍高?size命令会在非链接elf上产生无意义的结果吗?@Har:可能有不同的原因,例如它将.rodata
链接到.text
、对齐节或执行链接器松弛。很难说具体的灾难是什么。