对之前文章进行了一点补充,重新发下。
计算机程序可以认为就是处理输入数据然后输出处理结果,这中间就涉及到数据的传递处理,比如内存拷贝操作,字符串拷贝操作等等,而任何一个处理操作不当就可能导致程序异常崩溃,或者遭受其他恶意攻击,这就需要对这些数据操作异常小心。
数据的操作自然离不开 C 库函数了,如 memcpy、strcpy 等等。这些函数如果使用不当,则是很危险的,比如 memcpy 拷贝的长度实际大于目标长度,这就造成内存越界了。
而业界也有针对此类接口进行二次封装修改,以减少内存越界等这种错误的可能性,比如思科的 safec 库,都以原 C 库接口名加后缀 _s 命名作为替换,如 memcpy_s。下面就简单说下 safec 库的编译操作,具体接口使用说明可以直接看代码。
构建编译
safeclib 其对应的 github 地址:
https://github.com/rurban/safeclib
然后下载了当前较新的版本 safeclib-3.6.tar.gz,根据 README 说明文档,构建操作如下:
./build-aux/autogen.sh
./configure
make
但实际执行时出现如下错误:
➜ safeclib-3.6 ./build-aux/autogen.sh
fatal: not a git repository (or any of the parent directories): .git
说明文档给出了对应的提示
autogen.sh
only needs to be run if you are building from the git
repository.
就通过 git clone 操作下载了源码
git clone https://github.com/rurban/safeclib.git
再执行 ./build-aux/autogen.sh
命令就可以生成 configure 脚本文件了。
后面查看 autogen.sh 脚本文件,实际之前下载的3.6版本源码,直接执行最后的 autoreconf -Wall --install
命令就可以生成 configure 文件了。
然后执行 configure 脚本生成 Makefile 文件,并编译安装
make install_dir
./configure CFLAGS="-fPIC -Os" CC=arm-linux-gnueabihf-gcc --prefix=`pwd`/install_dir -host=arm-linux
make;make install
对生成的静态库删除一些不必要的符号信息,以减少库文件大小
arm-linux-gnueabihf-strip -x -R .note -R .comment *.a
可以看到默认情况下生成的 safec 库还是比较大的,有 360 多KB大。
裁剪
对于嵌入式设备,如果内存紧张,是可以考虑进行下裁剪。
如果不需要使用 strstr_s、strcmp_s、memcmp_s 等这类接口,则可以使用 --disable-extensions
选项,具体可以看源码中 SAFECLIB_DISABLE_EXTENSIONS 宏包含的接口
最后可以加上选项 --disable-constraint-handler
,关闭运行时错误输出打印信息,以减小内存大小。
make distclean; ./configure CFLAGS="-fPIC -Os" CC=arm-linux-gnueabihf-gcc --prefix=`pwd`/install_dir -host=arm-linux --disable-extensions --disable-constraint-handler;make;make install
重新构建编译后,大小变为 108KB,相比之前减小不少。
另外默认是不放开编译 snprintf_s, vsnprintf_s, snwprintf_s, vsnwprintf_s, tmpnam_s 这几个接口,如果要使用到,则需要增加选项 --enable-unsafe
。