本页汇总 gcc, gdb, make, 链接器与交叉编译相关笔记.
旧版零散编译记录已统一收敛到本页.
sudo apt install software-properties-common
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt install gcc-9 g++-9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 90 --slave /usr/bin/g++ g++ /usr/bin/g++-5 --slave /usr/bin/gcov gcov /usr/bin/gcov-5
sudo update-alternatives --config gcc
sudo apt install libgmp-dev libmpfr-dev libmpc-dev
svn checkout http://gcc.gnu.org/svn/gcc/trunk gcc-source
mkdir gcc-source/objdir
cd gcc-source/objdir
../configure --enable-languages=c,c++ --enable-checking=release --disable-multilib --disable-checking
make -j10
sudo make install
gcc -o a.out -g test.c, 生成带调试信息的可执行程序 a.out
gcc -E -o test.i -g test.c, 生成预处理文件test.i
gcc -S -o test.s test.c, 生成汇编文件
-Wa,<options> Pass comma-separated <options> on to the assembler.
-Wp,<options> Pass comma-separated <options> on to the preprocessor.
-Wl,<options> Pass comma-separated <options> on to the linker.
-Xassembler <arg> Pass <arg> on to the assembler.
-Xpreprocessor <arg> Pass <arg> on to the preprocessor.
-Xlinker <arg> Pass <arg> on to the linker.
"-Wl,-Map=test.map"与"-Xlinker -Map=test.map", 生成map文件, 效果相同
'f' stands for 'flag'.
ex:
-fpic # flag to set position independent code
-fno-builtin # don't recognize build in functions ...
'm' stands for mode.
objdump -d ProgramName, 反汇编
objdump -S ProgramName, 带有源码信息的反汇编
objdump --dwarf ProgramName, 查看 dwarf 格式调试信息
objdump --stabs ProgramName, 查看 stabs 格式调试信息
objdump -t ProgramName, 查看 symbol table
GDB Shell:
!!! help COMMAND, 下面的用法都可以加上前面的help, 查看细节
set args --ARGS, 设置可执行程序启动参数
pwd, 显示当前的工作目录
下面的命令多半都可以使用缩写哟
Debug Command:
基本操作:
r, run, 启动程序
where, 在哪, 到哪了, 打印所有栈帧的跟踪信息, 大概是bt的别名
l, list, 向后查看源码
l -, 向前查看源码
l LINENUM, 查看指定行附近的代码
l FILE:LINENUM, 查看指定文件的指定行附近的代码
l FUNCTION, 查看指定FUNCTION附近的代码
l LINENUM, 查看指定行附近的代码
l *ADDRESS, 查看指定地址附近的代码
set listsize 50, 设置默认列出的源码行数为50
show listsize, 显示默认列出的源码行数
set disassemble-next-line on, 显示下一行的反汇编信息
-, 进入tui模式, Ctrl + X + A, 退出tui模式
断点:
b, 加断点
b 16, 在当前第16行加断点
b i=1, 在i=1时加断点
b main, 在main函数入口添加断点
d, delete
d break, 删除所有的断点
d break 1, 删除序号为1的断点
i, info
i b, 查看断点信息
s, step, 单步走, 遇到函数则进入
n, next, 单步走, 不会进入函数
u, util
u 16, 即运行到第16行
finish, 完成并跳出当前的子函数
c, continue, 继续到下一个断点
info 查看信息:
print VARIABLE, 打印变量
display, 列出会自动显示的变量
display variable1, 设置variable1自动显示值
undisplay 1, 根据索引取消自动显示
栈帧(即函数的上下文):
bt, backtrace, 打印所有栈帧的跟踪信息
frame N, 选择并打印栈帧, !!! 这个会影响某些info的结果
info frame, 查看选择的栈帧信息, 默认当前帧, 由 frame N 选择
寄存器:
info registers, 查看所有的寄存器状态
info args, 查看参数
info locals, 查看局部变量
info breakpoints, 查看所有断点
print/x $eax, 查看特定寄存器的状态
Monitor Command:
monitor help, 查看所有monitor支持的命令
monitor reset, 重置设备
monitor halt, 暂停cpu
monitor reg, 查看所有寄存器内容
monitor reg PC, 查看PC寄存器内容
monitor targets, 查看目标状态
arm-none-eabi-gdb -q --readnow -ex "target remote 127.0.0.1:3333" -ex "monitor halt" -ex "load" -ex "b reset_isr" -ex "c" -ex "monitor resume" -ex "disconnect" -ex "q" app.elf
section [address] [(type)] :
[AT(lma)]
[ALIGN(section_align) | ALIGN_WITH_INPUT]
[SUBALIGN(subsection_align)]
[constraint]
{
output-section-command
output-section-command
…
} [>region] [AT>lma_region] [:phdr :phdr …] [=fillexp]