交叉编译工具集的一些小工具
1. elf操作系统之上的可执行文件包含头信息,可以,windows下是PE readelf
读取可执行文件支持的平台等信息
readelf -h xxx
aaa@aaa:~/Desktop$ readelf -h main
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x530
Start of program headers: 64 (bytes into file)
Start of section headers: 6440 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 29
Section header string table index: 28
2. 可执行文件包含数据大小size
size xxx
aaa@aaa-v:~/Desktop$ size main
text data bss dec hex filename
1517 600 8 2125 84d main
3. 符号列表nm 查看全局标签
T 全局函数标签,代码段
t static修饰的函数区
D 全局变量区
d static修饰的变量区
aaa@aaa-v:~/Desktop$ nm main
0000000000201010 B __bss_start
0000000000201010 b completed.7697
w __cxa_finalize@@GLIBC_2.2.5
0000000000201000 D __data_start
0000000000201000 W data_start
0000000000000560 t deregister_tm_clones
00000000000005f0 t __do_global_dtors_aux
0000000000200dc0 t __do_global_dtors_aux_fini_array_entry
0000000000201008 D __dso_handle
0000000000200dc8 d _DYNAMIC
0000000000201010 D _edata
0000000000201018 B _end
00000000000006d4 T _fini
0000000000000630 t frame_dummy
0000000000200db8 t __frame_dummy_init_array_entry
0000000000000834 r __FRAME_END__
0000000000200fb8 d _GLOBAL_OFFSET_TABLE_
w __gmon_start__
00000000000006f4 r __GNU_EH_FRAME_HDR
00000000000004e8 T _init
0000000000200dc0 t __init_array_end
0000000000200db8 t __init_array_start
00000000000006e0 R _IO_stdin_used
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
00000000000006d0 T __libc_csu_fini
0000000000000660 T __libc_csu_init
U __libc_start_main@@GLIBC_2.2.5
000000000000063a T main
U puts@@GLIBC_2.2.5
00000000000005a0 t register_tm_clones
0000000000000530 T _start
0000000000201010 D __TMC_END__
4. strip 去除可执行文件中的符号表
file xxx
查看是否去除符号表
aaa@aaa-v:~/Desktop$ file main
main: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=53fb9bc8b9b27b6dc018f8afaf611a8d482da38d, not stripped
strip xxx
去除可执行文件的符号表,size变小,用于发布
5. strings 查看程序中存在字符串
6. objcopy 按格式拷贝出代码段数据段(裸机开发时用
7. objdump 反汇编(调试bootloader时常用)
objdump -d(-D) xxx
将可执行文件转换成汇编代码
安装交叉编译工具
- 解压:
sudo tar jxvf xxx/arm-linux-gcc-4.3.2.tar.bz2
- 添加环境变量:
sudo gedit ~/.bashrc
export PATH=$PATH:/usr/local/arm/gcc-3.4.5-glibc-2.3.6/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm/gcc-3.4.5-glibc-2.3.6/lib
source ~/.bashrc
若出现错误:arm-linux-gcc: No such file or directory参考:
https://blog.csdn.net/zhengzg_6/article/details/54950707
这种情况是因为你的操作系统是Ubuntu 64位的,而交叉编译工具链都是32位执行程序。要成功运行这些交叉编译工具链,需要与这些工具链相关的32位库。安装命令如下:
sudo apt-get install libc6:i386 libstdc++6:i386 libncurses5:i386 zlib1g:i386
如果不行再执行下边这个:
sudo apt-get install ia32-libs
sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0