--- title: Lab36: ELF toc: no ... 預期目標 ------------- * 在 [STM32F429i Discovery](/embedded/STM32F429) 開發簡易 ELF loader * 學習 OpenOCD 和 gdb * 複習 [Week #7: ELF](/embedded/2014q3w7) 學習進度 預先準備 ------------ * 確認 [`$PATH`` 可找到 `Lab 35](/embedded/Lab35) 設定的 GNU Toolchain - ``arm-none-eabi-gcc -v`` 預期輸出 ``4.8.3-11ubuntu1`` 一類包含 ubuntu 的字串 - 若否,請重新設定 PATH 環境變數 - ``export PATH=/usr/bin:$PATH`` * 確認 [STM32F429i Discovery](/embedded/STM32F429) 板子已經由 USB 線接上裝有 GNU/Linux 的開發環境,並確保 [Lab 35](/embedded/Lab35) 所提及的工具均已正確安裝,如 openocd 與 gdb 取得 ELF loader 並在 STM32 驗證 -------------------------------------------- * ``cd workspace`` # 假設工作目錄為 ``workspace`` * ``git clone https://github.com/embedded2014/elf-loader.git && cd elf-loader`` * 開啟兩個虛擬終端機,在其中一個終端機執行以下 ``make openocd``,預期輸出為 .. code-block:: prettyprint CC main.c CC start.c LINK app.elf text data bss dec hex filename 164 8 4 176 b0 app.elf Creating list... ... Launch OpenOCD for stm32f4discovery Open On-Chip Debugger 0.9.0-dev-00105-ge1bc7f4 (2014-08-08-20:38) ... * 在另外一個終端機執行 ``make run`` - ``cd workspace/elf-loader && make run`` * 切換到原本執行 OpenOCD 的視窗,可見到以下輸出 (請保持耐心) .. code-block:: prettyprint ELF: Scan ELF indexs... ELF: Examining section 1 .text ELF: Examining section 2 .rel.text ELF: Examining section 3 .rodata ... ELF: Examining section 11 .symtab ELF: Examining section 12 .strtab ELF: Done ELF: Relocating section .text ELF: Offset Info Type Name ELF: 00000034 00001202 R_ARM_ABS32 i ... ELF: Relocating section .rodata ELF: Offset Info Type Name ELF: 00000038 00001502 R_ARM_ABS32 banner ... ELF: symAddr=20000F48 relAddr=20000F8C ELF: R_ARM_ABS32 relocated is 0x20000F54 Hello world on Oct 30 2014 at 17:28:11 (0) ... Done semihosting: *** application exited *** * 看到 ``Hello world`` 字樣出現 10 次,表示 ``app/main.c`` 編譯與連結出來的 ``app-striped.elf`` 已正確載入並執行 參考作業要求 ----------------- * 擴充 [Lab 35 STM32F429](/embedded/Lab35) 作業的 [freertos-stm32](https://github.com/embedded2014/freertos-stm32),允許在執行時期透過 OpenOCD,從 host 端載入 ELF 執行檔 (可視為遊戲程式的 plugin) 並執行 * 整合 [Lab 32](/embedded/Lab32) 開發的檔案系統與 shell,除了 ``ls`` 和``cat`` 命令外,額外提供 ``exec`` 命令 繳交作業 ------------- * 截止日期 - Nov 8, 2014 (含) 之前 * 更新作業提案到共筆網站: [Lab 36 / 作業共筆](https://embedded2014.hackpad.com/2014q3-Week-7-lzIBL1fkunQ),需要標注自己的 ID - 將符合作業提案的程式碼,提交到自行 fork 的 [freertos-stm32](https://github.com/embedded2014/freertos-stm32) 參考資料 ------------ * [BeagleBoard OpenOCD](http://elinux.org/BeagleBoardOpenOCD) * [GDB and OpenOCD](http://openocd.sourceforge.net/doc/html/GDB-and-OpenOCD.html) * [Anatomy of Linux dynamic libraries](http://www.ibm.com/developerworks/library/l-dynamic-libraries/)