Linux环境下动态库和静态库的编译调用

实验环境

操作系统:Ubuntu 16.04

gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)

源程序:hello.c、hello.h、star.c、starfun.h。starfun.h里面有star1函数和star2函数,我们不关心函数的功能,只要记得有star1和star2两个基本函数供其他函数调用。

/*****starfun.h*****/
#include <stdio.h>
#ifndef STARFUN_H
#define STARFUN_H
#define  NUM 4
#define  NUMBER 3
int star1() {
	int i,j,k;
	for(k=1;k<=NUM;++k) {
		for(i=1;i<=(NUM-k);++i)
			printf(" ");
		for(j=1;j<=(2*k-1);++j)
			printf("*");
  		printf("\n");
	}
	return 0;
}

int star2() {
	int i,j,k;
	for(k=NUMBER;k>=0;--k)  {
		for(i=1;i<=(NUMBER-k+1);++i)
           		printf(" ");
		for(j=1;j<=(2*k-1);++j)
			printf("*");
		printf("\n");
	}
	return 0;
}
#endif

hello.h自己定义了一个hello函数,并调用star1函数

/*hello.h*/
#include "starfun.h"
#ifndef  HELLO_H
#define  HELLO_H
void hello()   {
	star1();
	printf("hello,my friends\n");
}
#endif

hello.c内实现了showhello函数

/*hello.c*/
void showhello()  {
	hello();
}

主函数在star.c

/*star.c*/
#include "hello.h"
#include <stdio.h>
int main() {
	star1();
	star2();
	showhello();
	return 0;
}

下面把hello.c分别编译成动态库和静态库供star.c调用

动态库编译和调用

gcc -c -fpic hello.c	#生成目标文件hello.o
gcc -s -shared -o libhello.so hello.o	#生成动态库文件
sudo cp libhello.so /usr/lib	#拷贝动态库文件到/usr/lib
gcc star.c -l hello -o star	#生成最终的可执行程序star,注意star.c的位置在动态库前面
运行结果

静态库的编译和调用

ar -rc -o libhello.a hello.o	#根据已生成的hello.o生成libhello.a
gcc star.c libhello.a -o star	#调用libhello.a生成star

运行结果同上

kali rolling安装docker

  • 检测系统版本:

  • 需要安装一些软件包,使apt能够通过https操作repository
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common

安装docker官方的gpg密钥

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

导入docker的安装源

echo "deb https://download.docker.com/linux/debian stretch stable" >> /etc/apt/sources.list

导入以后更新一下源 apt-get update,再安装docker

apt install docker-ce

新版的docker安装的时候都叫docker-ce,docker-engine都是older-version,详见:https://docs.docker.com/install/linux/docker-ce/debian/

检测是否安装成功:

docker -v

linux gdb简单调试

  • 编译
gcc -g test.c -o t.out  //指定-g参数

以test.c为例:

  • gdb调试
gdb t.out

假设只有一个main函数,在main函数处下breakpoint

b main(或者break main)(下断点是第一步)
run 程序开始调试(一般是第二步)
continue 继续运行,直达下一个断点
next 运行下一步
下面几个我认为比较重要和常见
layout src 显示源代码
layout asm 显示汇编
layout regs 显示当前寄存器
layout split 显示源代码和反汇编窗口

reference:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html