Windyland serving my blog

Mingw上編譯環境的一點TIP

##環境選擇

  • 32 bit 照顧大多數人的需求
  • Windows XP 照顧大多數人中的大多數人的需求
  • Mingw-w64 mingw32項目中可靠的fork
  • TDM-GCC-32 4.8.1 被認為靠譜的build(也是被認為是遷移到x64首選)
  • MSYS 20111123build mingw-w64 項目最新的二進制分發, 雖然可能略老了

##代碼中注意的一些地方

  • windows 環境的默認宏定義是 _WIN32 可以根據這個判斷是否windows環境 (cygwin, mingw, msvc 都有這個定義),而且這個宏定義在win64環境中也是默認存在的。
  • windows 中有_putenv,但是沒有setenv
  • windows 中一些頭文件可能在winsocks2.h
  • mingw 環境中由於gcc的緣故所以是c99完備的,相比msvc(2013之前)不是 (不用自備stdint.h 或者相關hack)
  • mingw-build 的 toolchain 被報告有vsnprint不服從c99標準 (dimitri 這個問題妳怎麼看? ) 相比TDM-GCC 就沒有這個問題

##編譯時候需要注意的一些地方

  • msys 安裝完畢(其實就是解壓縮),執行/postinstall/pi.sh 指定mingw的路徑
  • 常見的包有 zlib libiconv pkg-config glib openssl libevent,可以選擇二進制分發
  • pkg-config 依賴與的glib
  • glib的thread 模式可以設置為pthread
  • 需要開啓pthread的地方,注意在LDFLAGS中除了增加-pthread外還需要增加-lwinpthread, 這和mingw32中不一樣
  • glib 中可能會報告timespec 定義未找到,其實相關的幾個定義都存在 pthread.hpthread_time.hpthread_???.h中,手動加到代碼中就好了
  • libevent 可以hack configure.ac 加入pthread 支持
  • openssl 編譯完成之後可以跑下測試
  • 記得設置CFLAGS 、LDFLAGS、PKG_CONFIG_PATH時候加入 /usr, /usr/local,倒是/mingw特意不用加上,同時建議不要安裝的妳包到/mingw上。

相關資料

A Quick Note For GDB Debugger

GDB 調試器快速筆記

LEvel 0 簡單使用

假定妳在調試gcc 程序,我們用 gdb gcc啟動之:

  • b main > 尋找main 函數,在上面設置一個斷點(break)

  • r > 啟動被調試的程序(run)

  • n > 執行下一步 (next)

  • s > 浸入下一步的函數 (step)

  • bt > 查看調用堆棧(backtrace),會顯示當前thread的函數調用的各層frames

  • p (int)argc > 輸出(print) argc 變量

  • p (char**)argv > 輸出二級指針argv

  • l > 列出(list) 當前程序源代碼

  • c > 繼續執行(continue)

  • <Ctrl-d> > unix 標準的eof 標示,等價與退出(quit) 命令

Level 1 初步調教1

啟動gdb的參數:

  • gdb program 加載program程序
  • gdb program core 加載program程序,並加載coredump 文件core
  • gdb program <pid> 加載program程序,並attach到此程序的的instance上
  • gdb --args gcc -O2 -c foo.c 加載gcc 程序,指定gcc的參數為-O2 -c foo.c
  • gdb -silence 靜默方式啟動gdb
  • gdb -help 幫助模式啟動gdb

啟動gdb的額外參數(具體請參見妳的man gdb):

  • 選擇相關的文件系列(源文件、SYMBOL文件、可執行文件、CORE DUMP、進程pid、 gdb 指令文件、其他)
  • 切換模式 (安靜模式、批處理模式、圖形界面模式、後台進程模式、等等)
  • gdb 默認會加載初始化文件.gdbinit,當然這視具體系統而定。
  • 在gdb 交互模式中鍵入shell program args, 會用shell 執行program args命令
  • 同樣的,鍵入make make-args 則可以執行make 命令,等價與 shell make make-args 命令
  • 鍵入 help 可以顯示幫助

Level 2 程序內調教

顯示當前狀態(info):

  • info breakpoints 顯示當前斷點
  • info terminal
  • info break

設置和顯示配置 (set/show), 比如logging:

  • set logging on 設置logging為開啓
  • show logging 顯示當前logging配置

相關的一些配置比如:paths, symbol-reloading and breakpoint pending

LEvel 2 日常使用

對進程/線程的操作

  • attach
  • detach
  • kill
  • thread
  • thread apply

設置斷點

  • break function
  • break +offset
  • break -offset
  • break linenum
  • break filename:linenum
  • break filename:function
  • break *address
  • break
  • break … if cond

設置watchpoint

  • watch expr
  • rwatch expr

設置當前的frame

  • frame args
  • f n or frame n
  • f addr or frame addr
  • up/down
  • up n/down n
  • select-frame
  • bt or backtrace
  • bt n or backtrace n
  • bt -n or backtrace -n
  • bt full or backtrace full

查看當前的一些信息

  • info breakpoints
  • info watchpoints
  • info threads
  • info signals
  • info handle
  • info frame
  • info args
  • info locals
  • info catch

Level 3 源碼交互

  • list linenum
  • edit
  • search
  • dir
  • info line linespec
  • disas or disassemble
  • info registers
  • gcore
  • x addr (examine)
  • show values
  • dump [format] memory filename
  • trace
  • info source

Level ?

來不及寫了,暫時到這裡為止。

CGDB

cgdb, cgdb, a guide 酷炫的gdb ncurse界面

cgdb screenshot

LLDB

如果妳調試的是C++/Objective-C 代碼或者妳使用的是macosx環境,那麼更推薦使用lldb 來代替gdb.

GDB and LLDB Command Examples 也是推薦使用的lldb參考資料。

更多

Computer System A Programmer s Perspective 2nd

这个书作为一本传统教科书(哪里传统了喂%——%),其实还有蛮多地方不靠谱的说。 难道只是错觉么…….

Some notes on Assembly Language Step by Step

##Book Assembly Language Step by Step: Programming with Linux 3rd

Chapters

Chapter 1-12

##Infamous Question

Q: How can I write Windows apps in assembly language?

A: Why would you want to do that?

2333333333333333~

Chapter 1-4

本书是那X86 + linux i386 做例子的。

Code and Data

在Assembly的世界中区分的很开的两样东西。如字面所示Code代表了可执行的部分,Data代表 剩余的部分。如果对可执行文件(比如ELF格式)有了解,这两者在ELF格式中都是有对应 的段落的。其实这两者相互交互之多,也是很有趣的。

Address

二进制Binary、八进制Octal、十进制Decimal, 十六进制 Hexadecimal - Byte 1 - Word 2 - Double Word 4 - Quad Word 8 - Ten byte 10 - Paragraph 16 - Page 256 - Segment 65,536 (64K)

Registers

  • CS code segment
  • DS data segment
  • SS stack segment
  • ES extra segment

16 bits: 32bits - AX EAX - BX EBX - CX ECX - DX EDX - BP EBP - SP ESP - SI ESI - DI EDI - IP EIP

  • Flags Register
  • FLAGS EFLAGS

  • Real mode flat model
  • Real mode segment model
  • Protected mode flat model
  • Protected mode segment model*

Chapter 5-6

Endianness

X86都是Little Endian

Tools

  • text editor
  • assembler (nasm)
  • linker (ld)
  • debugger (gdb)

Topics

  • assemble
  • relocatability
  • segmentation fault

Chapter 7-9

instructions

  • IN old real-mode days, only BX, BP, SI, DI hold an address and an address had two parts.
  • Flags: OP(overflow flag) DP IF SF ZF AF PF CF
  • EFlags: 32-bits, many left unused (intel x86)
  • DEC, INC, MUL + CF, DIV, NEG, MOVSX
  • info reg (gdb)

nasm program layout

  • .data section
  • .bss section
  • .text sectin
  • Labels
  • push-y (push, pushf, pushfd, pusha, pushad) and pop-y (…)
  • int 80 (linux kernel service)
  • iret, jnz and etc…

bits

  • least significant bit and most significatn bit
  • logical operation (AND, OR, XOR, NOT, SHL, Shifting with Carry Flag, Rotate)
  • CMP + JA/JAE/JB/JBE/…
  • TEST (1-bits test)
  • BT (0-bits test)
  • LEA
  • Protected Mode Addressing: BASE + (INDEX X SCALE) + DISP

Chapter 10-12

Most fantasy part of this book, talking about procedures\macros, and strings, c routines, left to you!

FreeBSD 的快速笔记

##Book The Design and Implementation of the FreeBSD Operating System 1st

##Chapters Chapter 1-2

出版时间2007年,这件是FreeBSD 6.x 系列问世的那年。(话说那年我还在高二呢,青葱 岁月啊~吭)。浊者是BSD 的老人,Marshall 叔最早是4.2BSD 的快速文件系统(fast file system)的实现者,然后参与了FreeBSD开发,后面那位就不是特别清楚了。

FreeBSD 是(最近也是最早)以网络栈出名,所以下面就省略了这部分了撒。

##第一章 简述了下FreeBSD的黑历史。

##第二章 Facilities - process - user interface to filesystem and devices - communication(ipc) - operational issues

##Kernel Organization: two different views ####Part A: platform independent part - timer and system-clock handling, descriptor management, and process management - paging and swapping - the I/O, control, and multiplexing operations performed on management - the pseudo-terminal interface and terminal line disciplines - (unix) sockets - communication protocols and generic network facilities

####Part B: platform dependent part - low-level system-startup actions - trap and fault handling - low-level manipulation of the run-time context of a process - configuration and initialization of hardware devices - run-time support for I/O devices

PS

第二版2014年9月份就要出版了,好期待啊。据说会更新FreeBSD 9、10 的一些梗,比如 ZFS、Jails 什么的饿/。-。/