静态库的生成和使用

静态库及其特点

静态库是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,自动化所,北京》

Junning Wu wechat
Welcome To Contact Me with My Personal WeChat ID(Weixin)