【Linux】Linux:sudo 白名单配置与 GCC/G++ 编译器使用指

📅 发布时间:2026/7/11 0:50:55 👁️ 浏览次数:
【Linux】Linux:sudo 白名单配置与 GCC/G++ 编译器使用指
一、sudo 白名单的配置详解我们在使用普通用户时若想用 root 权限创建文件等操作又不想切换账号就可以借助sudo临时获取 root 权限。但一般情况下普通用户直接用sudo提权会失败这是因为sudo的权限控制由/etc/sudoers文件及相关配置管理普通用户尚未被拥有权限的用户如 root在该文件中配置进 “白名单”即设置好对应的权限规则所以操作会被拒绝。【就像这样的场景】【如何将普通用户加入白名单】由于sudoers文件的拥有者是root所以得使用root用户添加切换root账号打开ect目录下的sudoers文件在图片黄色格子圈的地方按上述示例添加你的用户保存并退出文件后再次尝试上述图片可以看到用root身份创建file文件创建成功二、C/C 开发环境的核心支撑 —— 头文件与库文件我们能在 Windows 或 Linux 上开展 C/C 开发核心原因在于系统中提前或后续安装了C/C 开发相关的头文件和库文件。C/C 开发环境不只是 Visual StudioVS、GCC、G 这些编译工具语言本身的头文件和库文件才是更关键的支撑。像安装 VS2019、VS2022 时选择对应的开发包其实就是在同步下载 C 语言的头文件和库文件。对于编译型语言而言安装开发包必然要下载并安装对应的头文件与库文件而且 C 的头文件和库文件在 Windows 系统上也是存在的。【软件版本的裁剪条件编译的应用】以软件的社区版免费和专业版付费功能更丰富为例提供这些软件的公司并不需要维护两份完全独立的代码。借助条件编译技术公司可以根据不同的编译条件对社区版不需要的功能进行裁剪。比如在代码中通过#ifdef#ifndef等条件编译指令判断当前编译的是社区版还是专业版从而决定是否包含某些专业功能的代码段这样大大减少了代码维护的成本。三、GCC 与 G 的本质区别GCC是 GNU 编译器集合的总称支持 C、C、Java、Fortran 等多种语言当编译 C 代码时它会自动调用 C 编译器。G是 GCC 下专门用于编译 C 代码的工具本质上是 GCC 的一个前端会自动链接 C 标准库如libstdc。核心差异编译.c文件时GCC 会默认按 C 语言语法处理而 G 会默认按 C 语法处理编译.cpp文件时两者都会按 C 语法处理但 G 会自动链接 C 库GCC 则需要手动指定-lstdc选项才能链接 C 库。第一次编译失败是因为没有链接到C的库第二次加入-lstdc选项才链接成功四、编译的四个核心阶段要深入理解 GCC/G 的工作首先得知晓代码从源码到可执行文件的四个关键阶段每一步都在为最终生成可运行程序铺路。4.1 预处理宏替换与代码准备预处理阶段主要负责对源码进行 “初步加工”包括宏替换、头文件展开、条件编译执行以及注释删除等操作。指令示例gcc -E test.c -o test.i-E选项的作用是让 GCC 在完成预处理后就停止后续的编译流程。-o用于指定输出文件这里生成的 test.i文件就是经过预处理后的 C 原始程序里面已经完成了宏替换、头文件包含等操作。4.2 编译生成汇编代码这一阶段GCC 会先严格检查代码的规范性排查语法错误。若代码无误就会将其翻译成汇编语言。指令示例gcc -S test.i -o test.s-S选项能让 GCC 只进行编译不执行后续的汇编步骤最终生成汇编代码文件 test.s我们可以通过查看这个文件来了解代码对应的汇编指令。4.3 汇编生成目标代码汇编阶段是把编译阶段生成的.s汇编文件转换成机器可识别的目标文件.o文件。指令示例gcc -c test.s -o test.o-c选项会让 GCC 完成汇编操作生成二进制格式的目标文件 test.o不过这个目标文件还不能直接执行需要后续的链接步骤。4.4 链接生成可执行文件成功编译后就进入链接阶段。链接的作用是将目标文件与所需的函数库如 C 标准库进行关联最终生成可执行文件。指令示例gcc test.o -o test执行这条命令后GCC 会把目标文件 test.o与系统库等资源链接起来生成可执行文件 test此时就可以直接运行这个程序了。五、函数库静态库与动态库5.1 基础概念与核心特性【静态库】定义编译链接时会将库文件的全部代码嵌入可执行文件。后缀Linux 下通常为.awindows下为.lib。特点生成的可执行文件体积大但运行时不依赖外部库可独立运行。例如若程序链接了静态数学库编译后库代码直接 “打包” 进程序在无对应库的环境中也能运行。【动态库】定义编译链接时仅记录库引用程序运行时由运行时链接器加载库。后缀Linux 下通常为.so**如**libc.so.6**Windows 下为.dll**。特点可执行文件体积小多个程序能共享同一份库代码但运行时依赖库存在。若动态库缺失依赖它的所有程序可能都无法正常运行。5.2 GCC 编译时的链接行为【默认动态链接】GCC 编译生成可执行程序时默认采用动态链接方式。例如代码语言javascriptAI代码解释gcc test.c -o test生成的test是动态链接程序可通过file test验证输出含 “dynamic executable” 字样再用ldd test可查看其依赖的动态库列表。【file指令】功能说明用于辨识文件类型可判断文件是普通文本、可执行程序、压缩包、符号链接等并能分析文件编码、架构等信息。语法file [选项] 文件或目录...常用选项-c详细显示指令执行过程便于排错或分析程序执行的情形。-z尝试去解读压缩文件的内容。【静态链接的实现】:若要强制静态链接需添加-static选项代码语言javascriptAI代码解释gcc -static test.c -o test_static此时程序会链接静态库需系统安装对应静态库包如 CentOS 下可通过a安装静态 C 标准库和 C 标准库。用ldd hello_static验证会显示 “not a dynamic executable”说明无动态库依赖。5.3 链接的特殊情况与混合链接【无静态库时强制静态链接】若系统没有所需静态库却使用-static选项编译会失败。因为静态链接必须找到对应的静态库文件才能完成 “代码嵌入” 操作。【动态库与静态库共存时的链接优先级】当系统同时存在动态库和静态库且 GCC 都能找到时默认优先动态链接。-static的本质是改变链接优先级强制优先选择静态库但这种 “优先级改变” 是 “只适配一次” 的逻辑并非所有依赖都强制静态链接。【混合链接】实际开发中程序可采用混合链接部分模块动态链接部分静态链接。比如对核心功能模块链接静态库以保证独立性对通用功能链接动态库以节省资源但需通过复杂的编译选项或链接脚本精细控制一般在对程序性能、体积和依赖有特殊要求的场景使用。5.4 优缺点对比【动态库】优点资源共享多个程序共享同一份库代码节省磁盘空间、网络空间、和内存空间运行时库只加载一次。更新便捷库更新后只需替换动态库文件无需重新编译所有依赖程序。缺点运行依赖依赖的动态库缺失或版本不兼容时程序无法运行。加载开销运行时加载库会带来一定性能开销虽通常可忽略但对极致性能场景有影响。【静态库】优点独立性强程序不依赖外部库在纯净环境无对应动态库也能运行适合嵌入式设备、严苛运行环境的程序。运行稳定无动态库加载的不确定性运行行为更稳定。缺点体积庞大可执行文件包含库全部代码占用更多磁盘和内存。更新繁琐库更新后所有依赖程序都需重新编译链接。【补充】5.5 扩展知识可执行文件格式与调试构建【可执行文件格式】Linux 下可执行程序采用ELFExecutable and Linkable Format格式并非简单的二进制流而是包含段表、符号表等结构用于程序加载和链接。【debug 与 release 构建】debug 构建编译时添加-g选项如gcc -g hello.c -o hello_debug生成的程序包含调试信息可通过 GDBgdb hello_debug进行单步调试、变量查看等操作。release 构建默认不包含调试信息且可添加优化选项如-O2提升性能gcc -O2 hello.c -o hello_release生成的程序体积小、运行快适合发布。