读《程序员的自我修养》记录

读《程序员的自我修养》记录


单指令操作称为原子操作(++i,自增不是原子操作),
预编译/编译(cc1)/汇编(as,.o目标文件,生成Symbol表,Symbol即地址,代码段/数据段/)/链接(ld,重定位Symbol,链接的过程即各个模块的拼接过程)


链接过程主要包括地址和空间分配(allocation)/符号决议或绑定(symbol resolution or binding)/重定位(relocation,目标地址默认为0,链接时重定位)


有目标文件:
ELF格式文件($ file xxx.o 查看):可重定位文件(.a/.o)/可执行文件(.exe)/共享目标文件(.so .dll)/核心转储文件(略)
代码段(.code/.text):程序指令,只读,其他段为程序数据,读写;
数据段(.data):已初始化的全局变量/局部静态变量;
.bss段(block started by symbol):未初始化的全局变量/局部静态变量,默认为0,不占空间;
.rodata/.comment/.dynamic/.rel.text(重定位表)/.symtab(符号表)... 指定变量到特定的段(P68)
程序指令与数据分离的好处在于:1. 只读,与读写,防止程序段被修改;2. 现在CPU指令缓存与数据缓存分离,提高缓存命中率;3. 最重要的原因,程序副本时,只需保存一份指令部分,极大的节省内存。


从分析工具binutils(objdump/readelf/size)
$size xxx.so   //直接查看各个段的长度
$objdump -h xxx.so  //查看各个段信息  readelf  -h/-s xxx.so  // ELF header/段表
$objcopy -I binary -O elf32-i386 -B i386 image.jpg image.o //将二进制文件转为目标文件(P68)
$objdump -ht image.o  // 查看上条语句生成的目标文件


外部符号——全局符号(T,可被其他目标文件引用)与局部符号(t, 内部可见)
$readelf -s xxx.so //查看符号




特殊符号:程序起始地址/代码段结束地址/...  P85
函数签名:包括函数名/参数类型/所在类/名称空间/其他,用于区别其他同名函数;
强符号与弱符号,P92
调试信息:$strip foo


使用rm递归删除子目录下的所有.o文件
find . -name "*.o"  | xargs rm -f


addr2line/objdump工具
./arm-linux-androideabi-addr2line -C -f -e '/home/sensetime/data/projects/st_singlecam_blur/deps/st_personblur/install/android-armv7/release/android-armv7-debug-v2.0.5.9.2/lib/libst_personblur.so' 002fd66c 
./arm-linux-androideabi-objdump -d '/home/sensetime/data/projects/st_singlecam_blur/deps/st_personblur/install/android-armv7/release/android-armv7-debug-v2.0.5.9.3/lib/libst_personblur.so' > log.txt


# cmake查看宏定义与取消宏定义
get_directory_property( DirDefs COMPILE_DEFINITIONS )
message( "COMPILE_DEFINITIONS = ${DirDefs}" )
remove_definitions(-DPPL_USE_ARM)
get_directory_property( DirDefs COMPILE_DEFINITIONS )
message( "COMPILE_DEFINITIONS 2 = ${DirDefs}" )


# 保存编译log
./build_armv1.sh 2>&1 | tee log.txt




## merge 多个.a为一个.a文件 ####
rm -rf merge_libs
mkdir 'merge_libs'
mkdir 'merge_libs/all_libs'
cp ./install/android-armv7/release/lib/*.a ./merge_libs/all_libs/
cp ./source/depthSDK/src/depth_utils/multi_ppl/android-armv7/*.a ./merge_libs/all_libs/
cd ./merge_libs/all_libs
ar -x libdepth.a 
ar -x libkeypoints.a 
ar -x libppl_android_armv7.a 
ar -x libpplwrapper_android_armv7.a 
ar -x libprotobuf.a 
ar cru libdepthSDK.a *.o
ranlib libdepthSDK.a
cp libdepthSDK.a ../../
cd ../../
rm -rf merge_libs


cmake执行终端命令
EXECUTE_PROCESS(COMMAND rm -rf ${CMAKE_CURRENT_SOURCE_DIR}/sdk_common)


终端查看手机内存使用
#watch -n 0.1 adb shell dumpsys meminfo com.sensetime.blur.sample
#adb shell ps | grep -Ei 'algo|camera'

你可能感兴趣的:(编译链接,cmake,工具)