Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

编译工具

说明

  • 本页汇总 gcc, gdb, make, 链接器与交叉编译相关笔记.
  • 旧版零散编译记录已统一收敛到本页.

gcc安装

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

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选项

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笔记

objdump -d ProgramName, 反汇编
objdump -S ProgramName, 带有源码信息的反汇编

objdump --dwarf ProgramName, 查看 dwarf 格式调试信息
objdump --stabs ProgramName, 查看 stabs 格式调试信息

objdump -t ProgramName, 查看 symbol table

gdb 使用笔记

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

linker scripts

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]