波奇学Linux: sudo提权,gcc编译,动静态链接,debug版本

sudo给普通用户提权

在root用户下输入

vim /etc/sudoers

 添加白名单,名单上的用户可以用root权限运行

gcc和g++编译c和c++文件

g++可以编译c++和c文件

gcc只能编译c文件

 

./a.out 执行a.out可执行文件

 通过g++编译器展示预处理->编译->汇编->链接的文件

预处理:去注释,头文件展开,条件编译,宏替换

以test.c文件为例

 

gcc -E test.c -o test.i

 结果如图所示:

 1.stdio.h的头文件展开了

2.max宏被替换了

3.因为默认产生release版本,条件编译打印hello realease

4.注释被消除

条件编译便于实现对功能的裁剪,比如vip和普通用户之间功能裁剪可以通过条件编译实现。

gcc -S test.c -o test.s

对文件进行编译处理生成汇编代码

 输入指令,将汇编指令变成机器码

gcc -c test.c/test.i/test.s -o test.o

vim打开 

 用二进制编辑器 od指令打开

 gcc指令含义:-o 相当于命名生成的文件

gcc test.c -o test 默认是生成a.out可执行文件,此时生成的可执行文件 test(linux文件类型和后缀无关)

-E/-S/-c :从某个文件开始执行生成编译文件(test.i),链接文件(test.s),目标文件(test.o)

如gcc -S test.i -o test.s,从编译文件开始生成链接文件。如果换成test.c,变成从源文件开始生成链接文件。

ESc:对于esc键,文件后缀iso和ios有点像o放在最后

链接

test.o不能单独执行要通过链接头文件和库文件。头文件提高方法声明,库文件提供方法的实现如printf,scanf等,(库文件相当于源文件打包,还可以达到隐藏文件的目的。)

Linux包含动态库 xxx.so(静态库) 和 xxx.a(动态库),windows包含.dll(动态库)  .lib(静态库)

 只要是编译型语言安装开发环境时都会下载头文件和库文件,如vs安装时就会安装C标准文件。

链接一般有两种方式,动态链接和静态链接。

动态链接,可执行文件共用同一个库文件,编译器会告诉可执行文件库文件的路径,在程序运行时

去动态库提取。

 静态链接,库文件会拷贝一份给目标文件,可执行文件有库文件的代码。

usr/include 的头文件

库文件放在usr/lib64下

ldd查看可执行程序依赖的动态库

Linux centos默认是动态链接,用 -static选项可以进行静态链接 

file指令查看是动态还是静态链接。

关于动静态库:

默认动态库优先,-static的本质的改变优先级。

如果没有静态库,不能使用-static 指令。

如果没有动态库,只有静态库,一样可以链接。

在真实的链接场景中,往往动静态混合。-static把混合变成全静态。 

动静态的优缺点:

动态库相当于共享,能节省空间,一旦缺失会导致无法运行。

静态库不依赖库,能独立运行,占据空间大(拷贝了库的代码)

 debug和release版本:

gcc默认形成release版本,debug会比release添加debug信息,所以有了可追踪可调试的特性,但是也会导致debug版本内存占据大。

 -g选项相成debug版本

 查看debug信息

程序是由二进制01,构成,0,1代码有自己的格式ELF,其中可以读取debug信息也存在ELF中

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值