Clang/GCC安全编译与代码优化选项(合集)
好久不见喵~实在想不出开头就不想了,本期文章咱们来讲讲Clang/GCC的安全编译与代码优化选项。注意:优化选项建立在代码正确的前提下,且最好不要在使用GDB等工具调试时开启任何优化选项。
LTO(Link-Time Optimization):中文是链接时优化,最初由LLVM实现,可做到在编译时跨模块执行代码优化,功能有:
函数自动内联
去除无用代码
全局优化
LTO有大型LTO(monolithic LTO)和增量LTO(ThinLTO)两种实现,其中ThinLTO内存占用较少。虽然对于小型项目几乎无影响,但Google的内核源码由于默认是大型LTO,曾将咱的电脑整OOM了三回啊三回。据说ThinLTO有时反而有更好的性能,具体咱不清楚。编译参数(二选一):
1234# monolithic LTO:-flto# ThinLTO:-flto=thin
PIE(Position-Independent Executables):中文是位置无关可执行程序,配合内核的ASLR(Address Space Layout Randomization,地址空间随机化)功能将代码段 ...
C语言实现简单的pstree(子进程查询)功能
前言:最近开发ruri打算加个容器进程信息显示,由于ruri是C语言写的便决定还是用C实现。于是查半天。。。没查到一点相关内容。都欺负萌新是吧呜呜呜~然后就去看man proc了,有个特殊的文件/proc/${pid}/task/${tid}/children能记录子进程号,不过需要内核开启相关配置才行。。。。欺负萌新是吧呜呜呜~行吧,还是自己写唔喵。
已知条件:子进程pid永远大于父进程pid,即:pid>ppid/proc/${pid}列表可以列出所有运行中进程的pid号。/proc/${pid}/stat(status)文件可以解析出每个进程的ppid。其中stat更适合C语言等程序解析,status更适合脚本/人类解析。具体内容可以看man proc。“这题我知道,选D,钝角”“寄!”(死亡微笑)
开始编程:我们可以先去看看内核是如何存储进程信息的:
12345678910111213141516struct task_struct ...
终端控制码表by沨鸾
建议先用printf/echo测试下。更改光标风格,仅在Termux有效:
123"\e[2 q""\e[6 q""\e[4 q"
输出RGB颜色,TTY下无效:
12"\033[38;2;<R>;<G>;<B>m" #前景"\033[48;2;<R>;<G>;<B>m" #背景
256色:
12"\033[38;5;<num>m" #前景"\033[48;5;<num>m" #背景
常见:
123456789101112"\n" #换行"\b" #光标退格"\a" #响铃(手机是震动)"\033c" #清屏"\033[?25l" #隐藏光标"\033[? ...
Re:从零开始的容器安全——ruri开发笔记
前言:ruri刚发了rc1,之前一直咕咕咕着的开发笔记差不多也该写写了喵~笔记主要讲容器及安全原理,附带一点C语言。头图是项目最早的版本,真是怀念呢喵,那时候咱连数组都不会用,现在ruri代码都突破3k行了。
关于使用C语言:说实话虽然个人很喜欢C语言,但是并不太建议新手用C,go/rust相比起来学习成本以及易用性相较于C均有很大提升。C语言唯一的好处就是能直接查man手册,毕竟是Linux正统语言。使用C语言,您可能除了学习C之外,还需要掌握如下工具:
clang-tidy静态检测工具
clang-format格式化工具
GDB调试工具
ASAN内存检测工具
GNUMake用于配置项目构建过程
至于学习C语言的心得嘛,
123456789陷入无法察觉的overflow沦落于oom-killer之下的死尸就连无法看懂的魔数也错以为是莫名能跑的奇迹被泄漏的内存所填满内核惶恐逐渐失去的可维护性终于咕咕而终「bug还在↗↘↗↘↗↘↗➔➔↘↘」
(高速退学)
容器基本原理:Linux挂载点/设备文件:众嗦粥汁,Linux下的 ...
开源项目规范化指北
前言:又是迟来的更新喵~说实话咱自ruri开始开发以来就一直在想规范化问题了,虽然大概率不会有人帮咱写代码,(termux-container拆成三个项目结果都是咱自己维护可真寂寞),不过一个规范的项目自己看着也会心情愉悦嘛喵~话不多说咱还是开始今天的正文。(虽然可能会很水)
项目使用方法规范化:尤其对于只有命令行的项目,一个易懂的命令格式/调用方法十分重要。曾有人问过,如果有人对Qemu说:“你不觉得自己的使用方法很难吗?”,Qemu会如何回答?博主:“我又没让你用”。可那只是因为它是Qemu,要是咱写的东西需要这么复杂的命令行,估计这辈子都没人用了喵呜~所以,建议还是Keep it simple&stupid吧(可不是像archlinux一样直接拒绝萌新使用啊喵!!!)
文档规范化:如果是在Gayhub这种国际社区发布,墙裂建议默认Readme为英文文档(机翻就算了,老外自己有谷歌翻译的说)。当然国内社区的话随意。但文档内容一定要说明重点,如项目介绍,使用方法,使用的外部项目等。
选择合适的许可证:自己写的代码的话随意,如果有 ...
在Linux下优雅的调试C语言
最近在开发ruri时遇到不少问题,咱也是第一次写C,早知道头顶这么发凉就去用某邪教了呜喵~好了好了,C语言还是有许多优点的,只是可能入门成本高些罢了,如果善用测试工具的话还是没有那么糟糕的,话不多说我们开始今天的正文。
首要前提:代码没bug的就不要调试了,编程第一法则不就是能跑的代码不要动嘛喵~过早的优化是万恶之源,测试时不要开-O2,且尽量使用-O0 -fno-omit-frame-pointer -z norelro -z execstack -no-pie -fno-stack-protector -Wall -Wextra -pedantic -Wconversion来测试。至于O3。。。除非编码特别规范否则几乎是炸屎。那如果有bug呢?首先得能过编译器,编译器都报error的代码再高端的调试工具也无能为力。然后检查编译器的警告,加上参数-Wall -Wextra编译然后查看警告,若是编译器警告都无法修复的话。。。这bug咱还是别修了吧喵~如果编译器不报警呢?于是就是今天的主题了–如何面对编译时无法找出的bug。
消极面对:部分内存问题可以通过编译 ...
浅谈android设备sysfs接口硬件调用之手电筒,马达,呼吸灯
这篇文章我们来介绍下几个sysfs接口的调用。事实上,驱动接口一般有两种方式调用:ioctl()和read()/write()。前一种要么能读懂内核源码,要么照抄strace用户空间驱动得到的调用,因此不做研究。需要注意的是,由于安卓内核碎片化过于严重,各个厂商之间的代码差异过大,因此直接和内核交互来调用驱动并不是一个通用思路。但是对于某些特定设备的驱动调用却是个简单可行的方法,比如nothing phone的灯带。
手电筒:一般是个led类设备,小米10ultra的手电筒被注册到了/sys/class/leds/flashlight/下,当然也有部分设备叫led0或者其他,nothing的手电筒驱动咱还没找到,咱好笨喵呜~目录中有两个文件对我们有用:brightness和max_brightnessmax_brightness的内容是个固定值,定义了灯的最大亮度。brightness的内容是个无符号整形数值,定义了灯的亮度,向其写入一个不大于max_brightness的合法数值,灯会亮,数越大灯越亮,写入0关闭手电筒。什么 ...
为你的手机内核开启docker支持
注意:文章所述方法仅适用于非GKI或qgki的设备,新设备咱也不会搞。文章内所述手机为arm64架构,上古时期的32位架构请自行修改。注:pixel系列设备请换用repo工具以及官方构建工具并使用ThinLTO(在内存小于32G的设备上)。好了让我们开始吧喵!
首要前提:
手机能够解锁bl并获取root权限
手机内核开源,尽量是有大佬维护源码的
拥有一定Linux基础
如果设备或个人不满足以上条件者请自行退出喵!
前期准备:你可能需要准备如下内容:
Linux系统环境(理论上手机电脑均可,电脑最佳)
熟练使用搜索工具
git和make以及代码编辑工具的使用
基本了解cpu架构差异
这些内容咱是不会教你的,毕竟这不是文章重点喵唔……当然最好有个脑子,可惜咱没有呜QAQ………
正式操作:0x0001 root手机,不必多说0x0002 获取手机代号和cpu代号这一步请通过搜索工具进行。如小米10ultra代号cas,cpu代号SM8250。
0x0003 查找内核源码可以去官 ...
termux配置文件分享
termux版本:这里咱比较喜欢termux-monet,带有monet取色支持和背景自定义。链接:HardcodedCat/termux-monet
欢迎信息:原版:Generator/termux-motd修改版:Moe-hacker/termux-motd修改内容不介绍了,效果见仓库。
123git clone https://github.com/Moe-hacker/termux-motd ~/.motdecho ~/.motd/init.sh >> ~/.bashrcecho ~/.motd/init.sh >> ~/.zshrc
如果手机“恰好”有docker支持:
1mv ~/.motd/26-docker.disabled ~/.motd/26-docker
自启动docker并显示信息。
配色修改:贴出咱的配色:
12345678910111213141516171819background: #1E1E2Eforeground: #CDD6F4cursor: #A6E3A1col ...
hexo博客配置教程
咱自己的博客配置教程喵~
前期准备:本博客在linux环境下搭建,部分内容于windows下稍有不同。你需要:git,ssh,nodejs,npm,github-cli。你可能还需要:一个脑子。可惜咱是没有脑子的喵呜………去github账号设置=>开发者设置=>令牌中获取一个token。在你的github账户下创建 用户名.github.io这个仓库。注:github-cli的token为明文存储,请勿在不受您本人信任的设备上用这种方式登录。然后:
123gh auth logingit config --global user.email "你的电子邮件地址"git config --global user.name "你的github用户名"
hexo部署:1234567cd ~mkdir hexonpm config set registry https://registry.npmmirror.com/npm install -g hexocd hexohexo initnpm install hexo-t ...