22.6. GDB¸¦ ÀÌ¿ëÇÑ ¸ðµâ(loadable module) µð¹ö±ë

¸ðµâ ³»¿¡¼­ ¹ß»ýÇÑ ÆÐ´ÐÀ̳ª µ¿Àû ¸ðµâÀ» »ç¿ëÇÏ´Â ½Ã½ºÅÛ¿¡ ´ëÇØ ¿ø°Ý GDB µîÀ» ÀÌ¿ëÇØ µð¹ö±ëÇÒ ¶§, GDB¿¡°Ô ¾î¶»°Ô ÀÌµé ¸ðµâµé¿¡ ´ëÇÑ ½Éº¼ Á¤º¸¸¦ ¾òÀ» °ÍÀÎÁö¸¦ ¾Ë·ÁÁà¾ß ÇÕ´Ï´Ù.

ù°, µð¹ö±ë Á¤º¸¸¦ Æ÷ÇÔÇÏ¿© ¸ðµâµéÀ» ºôµåÇØ¾ß ÇÕ´Ï´Ù.

    # cd /sys/modules/linux
    # make clean; make COPTS=-g

¿ø°Ý GDB¸¦ ÀÌ¿ëÇÏ¿© µð¹ö±ëÇÒ ¶§¿¡´Â kldstat ¸í·ÉÀ» Ÿ°Ù ½Ã½ºÅÛ¿¡¼­ ½ÇÇà½ÃÄÑ ¸ðµâÀÌ ·ÎµùµÈ °÷À» ãÀ» ¼ö ÀÖ½À´Ï´Ù.

    # kldstat
    Id Refs Address    Size     Name
     1    4 0xc0100000 1c1678   kernel
     2    1 0xc0a9e000 6000     linprocfs.ko
     3    1 0xc0ad7000 2000     warp_saver.ko
     4    1 0xc0adc000 11000    linux.ko

¸¸¾à Ãæµ¹ ´ýÇÁ¸¦ µð¹ö±ëÇÒ ¶§¿¡´Â linker_files ¸®½ºÆ®¸¦ µû¶ó¼­ °¡¾ß ÇÕ´Ï´Ù. ÀÌ ¸®½ºÆ®´Â linker_files->tqh_first¿¡¼­ ½ÃÀÛÇϸç, ã´Â filenameÀ» °¡Áö´Â ¿£Æ®¸®¸¦ ãÀ» ¶§±îÁö link.tqe_next Æ÷ÀÎÅ͸¦ µû¶ó ÁøÇàÇÕ´Ï´Ù. ãÀº ¿£Æ®¸®ÀÇ address ¸â¹ö°¡ ÇØ´ç ¸ðµâÀÇ ·ÎµùµÈ ÁÖ¼ÒÀÔ´Ï´Ù.

´ÙÀ½À¸·Î´Â ¸ðµâ ³»¿¡¼­ÀÇ ÅØ½ºÆ® ¼½¼ÇÀÇ ¿É¼ÂÀ» ã¾Æ³»¾ß ÇÕ´Ï´Ù.

    # objdump --section-headers /sys/modules/linux/linux.ko | grep text
      3 .rel.text     000016e0  000038e0  000038e0  000038e0  2**2
     10 .text         00007f34  000062d0  000062d0  000062d0  2**2

À§ÀÇ ¿¹Á¦¿¡¼­ ã¾Æ¾ß ÇÏ´Â °ÍÀº .text ¼½¼ÇÀ̸ç, ¼½¼Ç 10ÀÌ µË´Ï´Ù. ³×¹øÂ° ¼ýÀÚ ¿µ¿ª(ÀüüÀûÀ¸·Î´Â ¿©¼¸¹øÂ° ¿µ¿ª)Àº ÆÄÀÏ ³»ÀÇ ÅØ½ºÆ® ¼½¼ÇÀÇ ¿É¼ÂÀ» 16Áø¼ö·Î ³ªÅ¸³½ °ÍÀÔ´Ï´Ù. ÀÌ °ªÀ» kldstat¿¡ ÀÇÇØ ¾Ë¾Æ³½ ·Îµù ÁÖ¼Ò¿¡ ´õÇØ ÇØ´ç ¸ðµâÀÇ ¸Þ¸ð¸® »ó¿¡¼­ÀÇ ÅØ½ºÆ® ÁÖ¼Ò¸¦ ±¸ÇÕ´Ï´Ù.

(kldstat¿¡ ÀÇÇØ ¾ò¾î³½)¸ðµâÀÇ ·Îµù ÁÖ¼Ò¸¦ ÃëÇÏ¿© ¿©±â¿¡ ¸ðµâ ³»¿¡¼­ÀÇ ÅØ½ºÆ® ¼½¼ÇÀÇ ¿É¼Â °ªÀ» ´õÇÕ´Ï´Ù(¿¹Á¦¿¡¼­´Â 0x62d0 + 0xc0adc000 = c0ae22d0). ÀÌ °ªÀÌ ¸ðµâ Äڵ尡 Àç¹èÄ¡µÈ ÁÖ¼Ò°¡ µË´Ï´Ù. GDBÀÇ add-symbol-file ¸í·ÉÀ» ÀÌ¿ëÇÏ¿© ¸ðµâ¿¡ ´ëÇÑ Á¤º¸¸¦ µð¹ö°Å¿¡ ¾Ë·ÁÁÝ´Ï´Ù.

    (kgdb) add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0
    add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22d0?
    (y or n) y
    Reading symbols from /sys/modules/linux/linux.ko...done.
    (kgdb)

ÀÌÁ¦ ¸ðµâ ³»ÀÇ ¸ðµç ½Éº¼¿¡ ´ëÇØ ¾ï¼¼½º¸¦ ÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù.