静态库及其特点
静态库是obj文件的一个集合,通常静态库以”.a”为后缀。静态库由程序ar生成。 静态库的优点是可以在不用重新编译程序库代码的情况下,进行程序的重新链接,这种方法节省了编译过程的时间(在编译大型程序的时候,需要花费很长的时间)。静态库的另一个优点是开发者可以提供库文件给使用的人员,不用开放源代码,这是库函数提供者经常采用的手段。
静态库生成
这里我们以《使用Gem5自定义RISC-V指令集》中添加的自定义指令mod为例,说明怎么样采用静态库的形式,提供给用户调用。主要包括3个文件:main.c ,hmod.c,hmod.h
//hmod.h
#ifndef __HMOD__
#define __HMOD__
int hmod(int a,int b);
#endif
//hmod.c
int hmod(int a,int b)
{
int c;
asm volatile
(
"mod %[z], %[x], %[y]\n\t"
: [z] "=r" (c)
: [x] "r" (a), [y] "r" (b)
) ;
return c;
}
下一步就是先生成目标文件hmod.o,这里的-c选项是不链接的意思。
llvm@llvm-vm:~/workspace/gem5/tests/test-progs/mod_test$ ../../../../freedom/rocket-chip/riscv-tools/riscv-tc-new/bin/riscv64-unknown-linux-gnu-gcc --static -o hmod.o -c hmod.c
llvm@llvm-vm:~/workspace/gem5/tests/test-progs/mod_test$ ls
hmod.c hmod.o mod_test.asm hmod.h
hmod_test.c mod_test mod_test.c
下一步就是静态链接库libhmod.a
llvm@llvm-vm:~/workspace/gem5/tests/test-progs/mod_test$ ../../../../freedom/rocket-chip/riscv-tools/riscv-tc-new/bin/riscv64-unknown-linux-gnu-ar -rcs libhmod.a hmod.o
llvm@llvm-vm:~/workspace/gem5/tests/test-progs/mod_test$ ls
hmod.c hmod.o libhmod.a mod_test.asm
hmod.h hmod_test.c mod_test mod_test.c
接下来就是使用刚编译好的静态链接库编写应用程序了。
#include <stdio.h>
#include "hmod.h"
int main(){
int a,b,c;
a = 5;
b = 2;
//asm volatile
//(
// "mod %[z], %[x], %[y]\n\t"
// : [z] "=r" (c)
// : [x] "r" (a), [y] "r" (b)
//) ;
c = hmod(a,b);
if ( c != 1 ){
printf("\nHAAWKING TEST: FAILED\n");
return -1;
}
printf("\nHAAWKING TEST: PASSED\n");
return 0;
}
可以直接在编译的时候加上库文件,也可以使用-l命令。
llvm@llvm-vm:~/workspace/gem5/tests/test-progs/mod_test$ ../../../../freedom/rocket-chip/riscv-tools/riscv-tc-new/bin/riscv64-unknown-linux-gnu-gcc --static -o hmod_test hmod_test.c libhmod.a
or
llvm@llvm-vm:~/workspace/gem5/tests/test-progs/mod_test$ ../../../../freedom/rocket-chip/riscv-tools/riscv-tc-new/bin/riscv64-unknown-linux-gnu-gcc --static -o hmod_test hmod_test.c -L ./ -lhmod
执行结果为:
llvm@llvm-vm:~/workspace/gem5$ ./build/RISCV/gem5.debug configs/example/se.py -c tests/test-progs/mod_test/hmod_test --output=sim.out --errout=sim.err
gem5 Simulator System. http://gem5.org
gem5 is copyrighted software; use the --copyright option for details.
gem5 compiled Dec 2 2019 10:18:05
gem5 started Dec 2 2019 19:43:49
gem5 executing on llvm-vm, pid 18527
command line: ./build/RISCV/gem5.debug configs/example/se.py -c tests/test-progs/mod_test/hmod_test --output=sim.out --errout=sim.err
Global frequency set at 1000000000000 ticks per second
warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes)
0: system.remote_gdb: listening for remote gdb on port 7000
**** REAL SIMULATION ****
info: Entering event queue @ 0. Starting simulation...
info: Increasing stack size by one page.
Exiting @ tick 3429500 because exiting with last active thread context
[1]+ Done gedit m5out/trace.out
llvm@llvm-vm:~/workspace/gem5$ cat m5out/sim.out
HAAWKING TEST: PASSED
One More Thing.我们再来看一下反汇编的结果:
00000000000102ae <main>:
102ae: 1101 addi sp,sp,-32
102b0: ec06 sd ra,24(sp)
102b2: e822 sd s0,16(sp)
102b4: 1000 addi s0,sp,32
102b6: 4795 li a5,5
102b8: fef42623 sw a5,-20(s0)
102bc: 4789 li a5,2
102be: fef42423 sw a5,-24(s0)
102c2: fe842703 lw a4,-24(s0)
102c6: fec42783 lw a5,-20(s0)
102ca: 85ba mv a1,a4
102cc: 853e mv a0,a5
102ce: 040000ef jal ra,1030e <hmod>
102d2: 87aa mv a5,a0
102d4: fef42223 sw a5,-28(s0)
102d8: fe442783 lw a5,-28(s0)
102dc: 0007871b sext.w a4,a5
102e0: 4785 li a5,1
102e2: 00f70a63 beq a4,a5,102f6 <main+0x48>
102e6: 0004d7b7 lui a5,0x4d
102ea: 82078513 addi a0,a5,-2016 # 4c820 <tcache_thread_freeres+0x54>
102ee: 2f4050ef jal ra,155e2 <_IO_puts>
102f2: 57fd li a5,-1
102f4: a801 j 10304 <main+0x56>
102f6: 0004d7b7 lui a5,0x4d
102fa: 83878513 addi a0,a5,-1992 # 4c838 <tcache_thread_freeres+0x6c>
102fe: 2e4050ef jal ra,155e2 <_IO_puts>
10302: 4781 li a5,0
10304: 853e mv a0,a5
10306: 60e2 ld ra,24(sp)
10308: 6442 ld s0,16(sp)
1030a: 6105 addi sp,sp,32
1030c: 8082 ret
000000000001030e <hmod>:
1030e: 7179 addi sp,sp,-48
10310: f422 sd s0,40(sp)
10312: 1800 addi s0,sp,48
10314: 87aa mv a5,a0
10316: 872e mv a4,a1
10318: fcf42e23 sw a5,-36(s0)
1031c: 87ba mv a5,a4
1031e: fcf42c23 sw a5,-40(s0)
10322: fdc42783 lw a5,-36(s0)
10326: fd842703 lw a4,-40(s0)
1032a: 04e787b3 mod a5,a5,a4
1032e: fef42623 sw a5,-20(s0)
10332: fec42783 lw a5,-20(s0)
10336: 853e mv a0,a5
10338: 7422 ld s0,40(sp)
1033a: 6145 addi sp,sp,48
1033c: 8082 ret
《完结于2019-12-02,模识楼507,自动化所,北京》