做网站 郑州公司,企业营销策划,wordpress多站点建站,有关优化网站建设的书籍1.大型lib库重命名函数名字 迭代的方式对于大型二进制库改名字的功能脚本
会将源文件中的函数 add_(...) 修改成 nubia_add_(...) 的方式来调用
此脚本分配来修改#xff0c;可以避免突破资源限制 ulimit -a#xff1b;
保存为#xff1a;redef_func_name_01.sh
chmod…1.大型lib库重命名函数名字 迭代的方式对于大型二进制库改名字的功能脚本
会将源文件中的函数 add_(...) 修改成 nubia_add_(...) 的方式来调用
此脚本分配来修改可以避免突破资源限制 ulimit -a
保存为redef_func_name_01.sh
chmod ux redef_func_name.sh 如果使能 echo -L $new
那么其中api_symbols( )中要写入本lib的公共的暴露出来的api函数名否则都不能被调用。
#!/bin/bashapitxt./funclist.txt
prefix_namenubia_api_symbols( )#1. 将 库文件的符号导出到本地文本文件
rm -rf ${apitxt}
nm $1 ${apitxt}#文本文件总行数
N$(sed -n $ $apitxt)#sed -n 300, 400 filename 注意p读出文件的 第300行到第400行for ((i1; i$N; i1000))
do
j$[i 999]#debug
#seg($(sed -n ${i}, ${j}p ${apitxt}))
#echo -e ${seg[]}
#echo $i $j
#取出i行到j行只保留T类型后面的文本即库中源代码实现的函数名字保存进internal_symbols中
internal_symbols($(sed -n ${i}, ${j}p $apitxt | sed /^[0-9]\ T /!d; s/// |sort | comm -13 (printf %s\n ${api_symbols[]} | sort) -
))#将 internal_symbols中的变量名字进一步修改成 --redefine-sym 原函数名修改后的函数名 的方式待后面丢给 objcopy 来调用
objcopy_args($(printf %s\n ${internal_symbols[]} |while IFS read -r sym; donew${prefix_name}${sym}# replace the symbol with a prefixecho --redefine-sym $sym$new# make the symbol local, future
# echo -L $newdone
))
#执行更换名字动作
objcopy ${objcopy_args[]} $1
done#$1 是脚本的第一个输入参数即 libxxx.a 使用方式
$ redef_func_name.sh libface.a 2.加密内部函数名 如果想隐藏加密内部函数名可以将上述脚本的改名部分使用下面脚本替代 #在之前的前缀名上在加入一个前缀, add_() 变成 nicaibudao_nubia_add_(),在经过md5sum处理成“乱码”more_prefixnicaibudao_md5sum_args($(printf %s\n ${private_symbols[]} |while IFS read -r sym; donew${more_prefix}$(echo $sym | md5sum | cut -d -f1)# replace the symbol with its md5sumecho --redefine-sym $sym$new# make the symbol localecho -L $newdone
))objcopy ${md5sum_args[]} $1#$1 是脚本的第一个输入参数即 libxxx.a 其中api_symbols( )中要写入本lib的公共的暴露出来的api函数名否则都不能被调用而且不知道函数名是什么。 3.小型库重命名 对于小型库比如nm liblittle.a的信息只有几十或几百行等可以使用国际友人的如下脚本 priv.c 源文件中是 内部函数的定义比如 float add_(float x, float y){ return xy;} interface.c 源文件中式 外部api函数定义比如 float ADD(float a, float b){return add_(a, b);} 如果想隐藏 add_ 并且改名字而将 ADD暴露出来 #!/bin/bash namespacenubia_# compile to object files
gcc -c -o priv.o priv.c
gcc -c -o interface.o interface.c# rename the object file so the names of files are not visible
nofilename$(echo nofilenames | md5sum | cut -d -f1).o
echo ${nofilename}
ld -relocatable priv.o interface.o -o $nofilename# create the static library
ar rcs static.a $nofilename# list of interface symbols
public_symbols( ADD )# list of private symbols - all symbols except interface symbols
private_symbols($(nm static.a | sed /^[0-9]\ T /!d; s/// |sort | comm -13 (printf %s\n ${public_symbols[]} | sort) -
))# strip unused symbols, leave only interface symbols
strip_args($(printf -K %s ${public_symbols[]}))
strip --strip-unneeded --strip-debug ${strip_args[]} static.a# rename all private symbols with its md5sum
objcopy_args($(printf %s\n ${private_symbols[]} |while IFS read -r sym; donew${namespace}$(echo $sym | md5sum | cut -d -f1)# replace the symbol with its md5sumecho --redefine-sym $sym$new# make the symbol localecho -L $newdone
))
objcopy ${objcopy_args[]} static.a