一、root白名单
sudo指令可以对一条指令进行提权,但是这个需要一个前置条件,即对应用户要在root的白名单中(sudoers名单);
sudoers名单只能是root用户添加,权限:r--r-----
地址:/etc/sudoers
指令:vim /etc/sudoers
在“root ALL=(ALL) ALL”后面添加“普通用户名 ALL=(ALL)ALL”
二、gcc/g++
c语言推荐用gcc,c++推荐用g++;gcc和g++的选项一模一样,因此一起介绍;
指令:gcc 文件名.c / g++ 文件名.cpp
功能:编译该文件,如果没有bug会生成可执行文件,如a.out;如果有bug会报错;
注意:gcc只能编译c语言,因此要求文件名的后缀为“.c”;g++可以编译c语言也可以编译C++,因此文件名后缀可以是“.c”也可以是“.cpp”;
背景(文本类源代码——>可执行程序):
1、预处理:宏替换、头文件展开、条件编译的处理、去注释
2、编译(生成汇编)
3、汇编(生成机器可识别的二进制代码)
4、链接(生成可执行文件或库文件)
选项:
- 无选项:默认执行到最后,得到可执行文件;
- -o [自定义文件名]:gcc / g++ 执行得到文件的自定义命名;
- -E 文件名.c/.cpp:只进行预处理,该选项后面如果没带 “-o” 那么预处理结果会打印出来,带了“-o”会将预处理结果保存在文件中,预处理后文件的标准形式为 “文件名.i”;
- -S 文件名.c/.cpp/.i:进行到第二步编译结束,如果是“.c/.cpp”就从头开始,如果是“.i”那就只进行编译工作,该语句之后也需带“-o”将结果保存在文件中,生成文件标准形式为“文件名.s”;
- -c 文件名.c/.cpp/.i/.s:进行到汇编,生成文件的标准形式为“文件名.o”,该文件vim查看会是乱码,因为vim是以文本的方式读内容,而该文件存储的是二进制(可重定位目标二进制文件,简称:目标文件;windows下是“文件名.obj”),虽然目标文件已经是机器语言了,但它不可以独立运行;
链接主要是和所调用库文件进行链接:
- Linux :.so(动态库)、.a(静态库) —— 库有自己的命名规则:libname.so.版本
- Windows :.dll(动态库)、.lib(静态库)
指令:ldd [可执行程序]
功能:查看一个可执行程序所依赖的动态库
机器上默认只安装了动态库,没有安装静态库;Linux中编译程序形成的可执行程序也默认采用动态链接;如果要使用静态链接需要 “gcc name.c -o rename -static” 使用这个需要提前安装静态库 “yum -y install glibc-static” “yum -y install libstdc++-static” (不同版本百度即可)
动态库:
需要的时候调用,只需要一个,多个程序共享,在可执行程序外部;
静态库:
将库中内容拷贝到目标程序中,之后程序运行独立不依赖可执行程序外部的库;
扩展:
- 没有静态库可以进行-static吗?答:不行;
- 没有动态库但有静态库可以进行编译吗?答:可以;说明:gcc默认优先动态链接,-static的本质就是改变链接的优先级
- 一个可执行程序不一定是纯动态链接或者静态链接,有很大概率是混合的,对不同的库调用的方式不一样;“-static”选项是将所有的链接都变成静态链接;
- 指令:file 文件名,查看文件详细属性,包括库的链接方式;
动态库 VS 静态库
- 动态库可以有效的节省资源(形成的可执行程序小,保存节省磁盘的空间,运行节省内存空间,传输的时候节省网络空间)
- 动态库一旦缺失会导致一大片程序无法运行;
- 静态库不依赖外部库,可以独立运行;
- 静态库体积大,比较消耗资源;
debug VS release
- gcc编译代码的时候生成的可执行文件默认是release版本的,如果要生成debug版本需要在后面加上“-g”选项;
- debug版本会比release版本多一些debug信息,可以通过“readelf(读取可执行程序的二进制构成) -S code_debug | grep -i debug”查看;
扩展:可执行程序形成的时候,并不是无序的二进制,它有自己的格式,Linux采用的是ELF格式; —— 《程序员的自我修养》