Unit Test

Unit Test ํ…Œ์ŠคํŠธ์˜ ์†์„ฑ ์ข‹์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ๊ธฐ์ค€์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ€๋…์„ฑ 3A(Arrange / Act / Assert) ์ˆœ์„œ๋Œ€๋กœ test case ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. test case ๊ฐ€ ์–ด๋–ค ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. test case ์˜ ์ด๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑ ํ•„์š” ์ตœ์‹  test framework (java ์—์„œ ์‚ฌ์šฉํ•˜๋Š” spock)์—์„œ๋Š” ์ž์—ฐ์–ด๋กœ test case ์ด๋ฆ„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. (google test ๋Š” ๋ฏธ์ง€์›) test case ์‹คํ–‰ ์‹œ printf ๋ฌธ์„ ํ•œ ๋ฒˆ ์ถœ๋ ฅ ํ•˜๋„๋ก ๊ทœ์น™์„ ์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. #define SPEC(msg) printf("[SPEC] %s\n", msg) TEST(SampleTestCase, SampleTest) { SPEC("์ด ํ…Œ์ŠคํŠธ๋Š” ๋ฌด์—‡์„ ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ž…๋‹ˆ๋‹ค"); } ์ฝ”๋“œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ์˜ค๋ฅ˜์˜ ์›์ธ์„ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ž์—ฐ์—ฌ์™€ ๊ฐ€๊น๊ฒŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•˜๋‹ค. ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ž์—ฐ์–ด๋กœ ์ƒ์„ธํžˆ ์ง€์ • ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ž์—ฐ์–ด๋กœ ์ถœ๋ ฅ ์œ ์ง€๋ณด์ˆ˜์„ฑ ...

<span title='2024-08-19 04:00:00 +0900 KST'>August 19, 2024</span>&nbsp;ยท&nbsp;37 min&nbsp;ยท&nbsp;AswinBlue

Make

make ๋ถ„ํ•  ์ปดํŒŒ์ผ์„ ํ†ตํ•ด ์ปดํŒŒ์ผ ์ž‘์—… ํšจ์œจ์„ ์˜ฌ๋ฆฌ๊ณ , ์ด ๊ณผ์ •์„ ์ž๋™ํ™” ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๊ด„์ฒ˜๋ฆฌ๋ฅผ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค. batch ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ ํ•˜๋ฉด, ๋ณ€๊ฒฝ์ ์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•ด batchํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ์„œ๋Š” ๋ถ„ํ•  ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. makeํŒŒ์ผ์€ ํŒŒ์ผ๋“ค ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ •์˜ํ•˜์—ฌ, ํŠน์ • ํŒŒ์ผ์ด ์ˆ˜์ •๋˜๋ฉด ์–ด๋–ค ํŒŒ์ผ์„ ์ปดํŒŒ์ผ ํ•ด์•ผํ•˜๋Š”์ง€ ์•Œ์•„์„œ ํŒ๋‹จํ•ด ์ค€๋‹ค. ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์˜ ์ˆ˜์ • ์‹œ๊ฐ„์„ ํ™•์ธํ•˜์—ฌ, ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์ด ์ƒ์„ฑ๋œ ์‹œ๊ฐ„๊ณผ ์†Œ์Šค๊ฐ€ ์ˆ˜์ •๋œ ์‹œ๊ฐ„์„ ๋น„๊ตํ•ด์„œ ์ปดํŒŒ์ผ ํ˜น์€ ๋งํ‚น์ด ๋‹ค์‹œ ํ•„์š”ํ•œ์ง€ ํŒ๋‹จํ•˜๋Š” ์›๋ฆฌ์ด๋‹ค. ๊ธฐ๋ณธ๊ตฌ์กฐ ํŒŒ์ผ ์ด๋ฆ„์€ Makefile ์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค. TARGET:DEPENDENCIES COMMANDS COMMANDS ์•ž์—๋Š” ๊ณต๋ฐฑ์ด ์•„๋‹ˆ๋ผ tab๋ฌธ์ž์ด๋‹ค. COMMAND๋ฅผ ์‹คํ–‰ํ•˜์—ฌ TARGETํŒŒ์ผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. TARGET์„ ์ƒ์„ฑํ•  ๋•Œ DEPENDENCIES ํŒŒ์ผ๋“ค์ด ํ•„์š”ํ•˜๋‹ค. DEPENDENCIESํŒŒ์ผ์ด ์ˆ˜์ •๋˜๋ฉด TARGETํŒŒ์ผ๋„ ๋‹ค์‹œ ์ปดํŒŒ์ผ ํ•ด์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. # ์ฃผ์„ : ์ฃผ์„์€ #์œผ๋กœ ๋‹ฌ ์ˆ˜ ์žˆ๋‹ค. @COMMANDS: makeํŒŒ์ผ์€ ์‹คํ–‰์‹œ โ€˜์‹คํ–‰ํ•œ ๋ช…๋ น ์›๋ฌธโ€™ ๊ณผ โ€˜์‹คํ–‰ ๊ฒฐ๊ณผโ€™ ๋ฅผ ๋ชจ๋‘ ์‰˜์ด ์ถœ๋ ฅํ•œ๋‹ค. @๋ฅผ ๋ถ™์ด๋ฉด ๋ช…๋ น ์›๋ฌธ์€ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ธฐ๋ณธ ํ˜•ํƒœ๋ฅผ ์•ฝ๊ฐ„ ๋ณ€ํ˜•ํ•˜์—ฌ ๋ช…๋ น์–ด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค. DEPENDENCIES ๋ฅผ ์—†์ด TARGET ๊ณผ COMMANDS ๋งŒ ๋‚จ๊ธฐ๋ฉด, make TARGET ๋ช…๋ น์„ ์ž…๋ ฅ์‹œ ํ•ด๋‹น COMMANDS ๋งŒ ์ˆ˜ํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. clean: rm -f ${OBJ}${TARGET} # make clean ๋ช…๋ น์‹œ ์œ„ ๋™์ž‘ ์ˆ˜ํ–‰ install: ... # ๋™์ผํ•œ ํ˜•ํƒœ๋กœ ๋‹ค๋ฅธ ๋ช…๋ น๋„ ์ž‘์„ฑ ๊ฐ€๋Šฅ make ํŒŒ์ผ ์ •์˜ COMMANDS ๋Œ€๋ถ€๋ถ„์˜ ๋ช…๋ น๋“ค์€ ์‰˜ ๋ช…๋ น๊ณผ ์œ ์‚ฌํ•˜๋‹ค. echo <VALUE> : VALUE ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. VARIABLE = VALUE : VARIABLE ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , VALUE ๊ฐ’์„ ๋Œ€์ž…ํ•จ ๋ณ€์ˆ˜ ์„ ์–ธ์‹œ ์ž๊ธฐ ์ž์‹ ์„ ์ฐธ์กฐํ•˜๋Š” ํ˜•ํƒœ(recursive)๋Š” = ์—ฐ์‚ฐ์ž๋กœ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. (ex: VARIABLE = ${VARIABLE} + DATA) ๋Œ€์‹  := ์—ฐ์‚ฐ๊ณผ += ์—ฐ์‚ฐ์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ex) VARIABLE := ${VARIABLE} + DATA, VARIABLE += DATA $(VARIABLE) : VARIABLE ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ํ˜ธ์ถœ (${VARIABLE} ๊ณผ ๋™์ผ) TIP: ์ปดํŒŒ์ผ ๋„๊ตฌ๋ฅผ ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•ด ๋†“์œผ๋ฉด ์ข‹๋‹ค. CC=gcc -> $(CC) -c file.c TIP: ์ตœ์ข… ํŒŒ์ผ ์ด๋ฆ„์„ ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•ด ๋†“์œผ๋ฉด ์ข‹๋‹ค. PROJECT_NAME=myProject -> gcc -o $(PROJECT_NAME) file1.o file2.o TIP: .oํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” -c ์˜ต์…˜์„ CFLAGS ๋กœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค. -> CFLAGS = -I./include -c ์™€ ๊ฐ™์ด include path ๋ฐ ๊ธฐํƒ€ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค. TIP: ๋งํ‚น์„ ์œ„ํ•œ LFLAGS ๋˜ํ•œ ๊ฐ™์€ ๋งฅ๋ฝ์—์„œ ๋ณ€์ˆ˜๋กœ ํ™œ์šฉํ•˜๋ฉด ์ข‹๋‹ค. ${VARIABLE:ASIS=TOBE} : VALUE ๋ณ€์ˆ˜์—์„œ ASIS๋ผ๋Š” ๊ตฌ๋ฌธ์„ TOBE๋ผ๋Š” ๊ตฌ๋ฌธ์œผ๋กœ ์น˜ํ™˜ํ•œ๋‹ค. (ex: PROJECT_NAME:my=your-> ${PROJECT_NAME} == yourProject) ๋‚ด์žฅ ๋งคํฌ๋กœ make ํŒŒ์ผ์˜ target-dependency-command ๋ผ์ธ๋“ค์— ์ผ์ผ์ด ํŒŒ์ผ ์ด๋ฆ„์„ ์จ ๋„ฃ๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ ๋ฒˆ๊ฑฐ๋กญ๊ธฐ์—, ์•„๋ž˜์™€ ๊ฐ™์ด ๋งคํฌ๋กœ๋ฅผ ํ™œ์šฉํ•ด ์ข€๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋‚ด์žฅ ๋งคํฌ๋กœ๋ฅผ ํ™œ์šฉํ•˜๋ฉด command์— ํŒŒ์ผ ์ด๋ฆ„์„ ์ง์ ‘์“ฐ์ง€ ์•Š์•„๋„ ๋˜๊ฒŒ ๋œ๋‹ค. $< : DEPENDENCIES ์ค‘ ๊ฐ€์žฅ ์„ ๋‘ $^ : DEPENDENCIES ์ „์ฒด๋ฅผ ์˜๋ฏธ $@ : TARGET์„ ์˜๋ฏธ $* : ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” TARGET์„ ์˜๋ฏธ $? : DEPENDENCIES ์ค‘ TARGET๋ณด๋‹ค ์ˆ˜์ • ์‹œ๊ฐ„์ด ๋Šฆ์€ ํŒŒ์ผ๋“ค .c.o: : Makefile ์•ˆ์—์„œ ์–ธ๊ธ‰๋œ ๋ชจ๋“  xxx.o ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ xxx.c ํŒŒ์ผ๋“ค์„ ์ปดํŒŒ์ผํ•˜์—ฌ xxx.o ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. %.o : %.c : .c.o ์™€ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๋‚ธ๋‹ค. ์ข€๋” ์‹ ๊ทœ ์Šคํƒ€์ผ์ด๋‹ค. ์ตœ์ข… ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. CC = gcc CFLAGS = -c TARGET = a.out OBJ = main.o func1.o ${TARGET} : ${OBJ} ${CC} ${OBJ} -o ${TARGET} # gcc main.o func1.o -o a.out ์™€ ๋™์ผ .c.o : # ์œ„์—์„œ ์–ธ๊ธ‰๋œ ๋ชจ๋“  .o ํŒŒ์ผ(OBJ)์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด .c ํŒŒ์ผ๋กœ .o ํŒŒ์ผ ์ƒ์„ฑ ${CC} ${CFLAGS} $< # $<๋Š” ๊ฐ€์žฅ ์„ ๋‘์˜ dependency๋ฅผ ์˜๋ฏธํ•จ. ์ฆ‰ gcc -c xxx.c ์™€ ๋™์ผ ์‰˜ ๋ช…๋ น์–ด make : ํ˜„์žฌ ๊ฒฝ๋กœ์— ์žˆ๋Š” Makefile ์„ ์‹คํ–‰ํ•œ๋‹ค. make install : ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ์†Œ์Šค๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ /usr/local/lib, /usr/local/bin ํด๋”๋กœ .soํŒŒ์ผ๊ณผ .binํŒŒ์ผ ๋ณต์‚ฌ make -f <FILE_NAME> : Makefile ๋Œ€์‹  FILE_NAME ์„ makeํŒŒ์ผ๋กœ ๊ฐ€์ •ํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค. make -p : ์„ค์ •๋œ ๋งคํฌ๋กœ ์˜ต์…˜๋“ค์„ ํ™•์ธ ๊ฐ€๋Šฅ

<span title='2023-07-13 18:35:05 +0900 KST'>July 13, 2023</span>&nbsp;ยท&nbsp;3 min&nbsp;ยท&nbsp;AswinBlue

Gcc

GCC C / C++ ์–ธ์–ด๋ฅผ ์ปดํŒŒ์ผ ํ•ด ์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค. ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” apt ๋ช…๋ น์œผ๋กœ ์„ค์น˜ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์œˆ๋„์šฐ์—์„œ๋Š” Mingw์„ ์ด์šฉํ•˜์—ฌ ์„ค์น˜ ๊ฐ€๋Šฅํ•˜๋‹ค. gcc๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํฌํ•จํ•œ ํŒจํ‚ค์ง€์ผ ๋ฟ, ๋‚ด๋ถ€์ ์ธ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋”ฐ๋กœ ์žˆ๋‹ค. (cc1 ๋“ฑ) GCC ์ปดํŒŒ์ผ ๋™์ž‘ ์ˆœ์„œ gcc main.c ํŒŒ์ผ์„ ๋™์ž‘์‹œํ‚ค๋ฉด main.cํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜์—ฌ ์‹คํ–‰ํŒŒ์ผ์ธ a.out ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค. ์ „์ฒ˜๋ฆฌ : c์–ธ์–ด๋กœ ๊ตฌํ˜„๋œ .c ํŒŒ์ผ์„ ์ „์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋œ .i ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. gcc -E main.c -o a.i : main.c ํŒŒ์ผ์„ a.i ํŒŒ์ผ๋กœ ์ „์ฒ˜๋ฆฌ ์ปดํŒŒ์ผ : ์ „์ฒ˜๋ฆฌ๋œ .i ํŒŒ์ผ์„ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ๋ณ€ํ™˜ gcc -S a.i -o a.s : a.i ํŒŒ์ผ์„ a.s ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ์–ด์…ˆ๋ธ” ์–ด์…ˆ๋ธ”: ๊ฐ ๋ฒค๋”๋“ค์ด ๋งŒ๋“  ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋ฅผ ๋ชฉ์ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜(์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜) gcc -c a.s -o a.o : ์–ด์…ˆ๋ธ”๋ฆฌ ํŒŒ์ผ์„ ๋ชฉ์  ํŒŒ์ผ EOL(Executable Linux File)๋กœ ๋ณ€ํ™˜. ํ•˜์ง€๋งŒ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜๋Š” ์—†๋‹ค. file a.o ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅ ํ•ด ๋ณด๋ฉด โ€œLSB relocatableโ€ ์ด๋ผ๊ณ  ํ‘œ์‹œ๋œ๋‹ค. ์ฆ‰, ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ๋กœ, ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋Š” ์•„๋‹ˆ๋ผ๋Š” ๋œป์ด๋‹ค. ๋งํ‚น: ๋ชฉ์ ํŒŒ์ผ์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ๋ชฉ์ ํŒŒ์ผ๋“ค์„ linkingํ•˜์—ฌ ์ตœ์ข… ์‹คํ–‰ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. gcc a.o -o out : a.o ๋ชฉ์ ํŒŒ์ผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. file out ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅ ํ•ด ๋ณด๋ฉด โ€œLBS executableโ€ ๋ผ๊ณ  ์ถœ๋ ฅ๋œ๋‹ค. gcc -v --save-temps -o out : ์œ„ ์ „์ฒด ๊ณผ์ •์„ ์‹คํ–‰ํ•˜๋ฉฐ ์ค‘๊ฐ„ ์ƒ์„ฑ๋ฌผ์„ ๋‚จ๊ธฐ๊ณ , ์‹คํ–‰ ๊ฒฐ๊ณผ๋„ ์ถœ๋ ฅ ๋ฆฌ๋ˆ…์Šค์—์„œ ldd ๋ช…๋ น์œผ๋กœ ๋งํ‚น์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ASLR์„ ์ง€์›ํ•˜๋Š” ์ปค๋„์˜ ๊ฒฝ์šฐ, -no-pie ์˜ต์…˜์„ ๋„ฃ์œผ๋ฉด PIE( position independent executable) ์˜์—ญ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„ ASLR ๊ธฐ๋Šฅ์„ ๋Œ ์ˆ˜ ์žˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ—ค๋”ํŒŒ์ผ์—์„œ include๋ฅผ ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชฉ์ ํŒŒ์ผ์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ์นญํ•œ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋งํ‚น์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์— ํฌํ•จ๋˜๋ฉฐ, ๋งํ‚น ๋ฐฉ์‹์— ๋”ฐ๋ผ โ€˜์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌโ€™์™€ โ€˜๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌโ€™๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค. ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ •์  ๋งํ‚น์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋ฉฐ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ฝ”๋“œ์˜ object ํŒŒ์ผ์ด ์ž์ฒด์— ํฌํ•จ๋˜๋Š” ํ˜•ํƒœ์ด๋‹ค. ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ณ , ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ๋ณ€๊ฒฝ์‹œ ํŒŒ์ผ์ด ๋งค๋ฒˆ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. gcc -static ์™€ ๊ฐ™์ด static ์˜ต์…˜์„ ๋„ฃ์–ด ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค. ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋™์  ๋งํ‚น์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋ฉฐ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์˜ object ํŒŒ์ผ์ด ๋ณ„๋„๋กœ ์กด์žฌํ•˜๊ณ , ๋ง์ปค๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์˜ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉ์ž์˜ ์ฝ”๋“œ์™€ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ํ˜•ํƒœ์ด๋‹ค. ๋นŒ๋“œ์‹œ ๋ณ„๋„ ์˜ต์…˜์„ ๋„ฃ์ง€ ์•Š์œผ๋ฉด dynamic linking ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ๋™์  ํ• ๋‹น์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์˜ ํ•จ์ˆ˜๋ฅผ PLT(Procedure Linkage Table) ์™€ GOT(Global Offsets Table)๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ฒŒ ๋œ๋‹ค. C์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์€ lib ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ทœ์น™์„ ์ง€๋‹ˆ๋ฉฐ .a ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„๋‹ค gcc -c CFILE.c -o OBJ.o ๋ช…๋ น์œผ๋กœ OBJ.o ๋ชฉ์ ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด, ar rcv libmylib.a OBJ.o ๋ช…๋ น์œผ๋กœ libmylib.a๋ผ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค. ar t libmylib.a ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด OBJ.j ํŒŒ์ผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์ปดํŒŒ์ผ ํ•  ๋•Œ gcc main.c libmylib.a ์™€ ๊ฐ™์ด ์ปดํŒŒ์ผ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ gcc main.c -lmylib ์™€ ๊ฐ™์ด -l ์˜ต์…˜์„ ์ด์šฉํ•œ๋‹ค. ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์—์„œ ์•ž์ชฝ์˜ lib ๋ถ€๋ถ„๊ณผ ๋’ค์ชฝ์˜ .a ๋ถ€๋ถ„์„ ์ œ์™ธํ•œ ๋ถ€๋ถ„์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์ด๋‹ค. ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” mylib์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์ด๋‹ค. ...

<span title='2023-07-10 22:13:06 +0900 KST'>July 10, 2023</span>&nbsp;ยท&nbsp;4 min&nbsp;ยท&nbsp;AswinBlue

C++_stl

C++ STL ์ž๋ฃŒ๊ตฌ์กฐ map key-value ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ treeํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ C++์—์„œ๋Š” red black tree๋กœ ๊ตฌํ˜„๋˜์–ด ์‚ฝ์ž…,์‚ญ์ œ๊ฐ€ O(log n) ์•ˆ์— ์ด๋ฃจ์–ด์ง„๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ key๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ž๋ฃŒ๋ฅผ ์ •๋ ฌํ•œ๋‹ค. ํ—ค๋” : #include <map> ์„ ์–ธ : map<int, int> map1; ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์„ ์–ธ : map <int, int, greater> map2 ์‚ฝ์ž… : insert : map1.insert({"key",VALUE}) [] : map1["key"] = VALUE ์‚ญ์ œ : ํŠน์ • index : map1.erase(map1.begin()+2) ํŠน์ • key : map1.erase(KEY) ๊ตฌ๊ฐ„ : map1.erase(map1.begin(), map1.end()) ์ „์ฒด : map1.clear() ๊ฒ€์ƒ‰ : map<int, int>::Iterator res; if ((res = map1.find(KEY)) != m.end()) { res -> first; // key res -> second; // value } ๋ฐ˜๋ณต๋ฌธ : for (auto itr = map1.begin(); itr != map1.end(); itr++) { itr->first // key itr->second // value } hash map hash table์„ ์ด์šฉํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ์ •๋ ฌ์ด ํ•„์š”์—†๋Š” ๋น„์ˆœ์ฐจ์  ๊ตฌ์กฐ ํ—ค๋” : #include<hash_map> ...

<span title='2022-04-12 19:17:21 +0900 KST'>April 12, 2022</span>&nbsp;ยท&nbsp;2 min&nbsp;ยท&nbsp;AswinBlue

GDB

GDB GNU Debugger์˜ ์•ฝ์ž ์œ ๋‹‰์Šค์˜ ๋””๋ฒ„๊ฑฐ๋Š” ์˜คํ”ˆ์†Œ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ GNU์—์„œ ์ƒˆ๋กœ ๊ฐœ๋ฐœํ•œ ๋””๋ฒ„๊ฑฐ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด์„œ๋Š” register(๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’), disassem(rip ๋ถ€๊ทผ ์ฃผ์†Œ๋ฅผ ๋””์Šค์–ด์…ˆ ํ•œ ๊ฐ’), stack(์Šคํƒ์˜ ๊ฐ’), backtrace(ํ˜„์žฌ rip์— ๋„๋‹ฌ ํ•  ๋•Œ ๊นŒ์ง€ ๊ฑฐ์ณ๊ฐ„ ํ•จ์ˆ˜๋“ค) ์„ ํŒŒ์•…ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ context(๋งฅ๋ฝ) ์ด๋ผ ํ•œ๋‹ค. pwndbg ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜๋ฉด hacking์— ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค. https://github.com/pwndbg/pwndbg ์ฃผ์†Œ์—์„œ git์„ clone ๋ฐ›๊ณ , ./setup.sh๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์ดํ›„ gdb ๋ช…๋ น์„ ์น  ๋•Œ ์ž๋™์œผ๋กœ pwndbg ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ ์šฉ๋œ gdb๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์ปดํŒŒ์ผ gcc๋กœ ์ปดํŒŒ์ผ์‹œ ์˜ต์…˜์— -g ๋ฅผ ๋ถ™์—ฌ์•ผ ์†Œ์Šค๋ฅผ ๋ณด๋ฉด์„œ ๋””๋ฒ„๊น…์ด ๊ฐ€๋Šฅ ๋ฆฌ๋ˆ…์Šค์—์„œ ์ปดํŒŒ์ผํ•œ ํŒŒ์ผ์€ ELF (Executable and Linkable Format) ์˜ ์‹คํ–‰ ํŒŒ์ผ์ด ๋œ๋‹ค. ELF ํŒŒ์ผ์€ ํŒŒ์ผ ์‹คํ–‰์— ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ๋“  ํ—ค๋”์™€ ์—ฌ๋Ÿฌ ์„น์…˜๋“ค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์„น์…˜์—๋Š” ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ ๋“ฑ์˜ ์ •๋ณด๋“ค์ด ๋“ค์–ด์žˆ๋‹ค. readelf -h [ELFํŒŒ์ผ] ๋ช…๋ น์œผ๋กœ ELF ํŒŒ์ผ์˜ ํ—ค๋” ์ •๋ณด๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. gdb ์˜ต์…˜ gdb [ํŒŒ์ผ์ด๋ฆ„] : ํ•ด๋‹น ํŒŒ์ผ์ด๋ฆ„ ๋””๋ฒ„๊น… ์‹คํ–‰ --args [arg1] [arg2] [...] : ํŒŒ์ผ ์‹คํ–‰์— ํ•„์š”ํ•œ argument๋ฅผ ์ „๋‹ฌ ๊ธฐํƒ€ ๋ช…๋ น์–ด ์‹คํ–‰ ์ „ ์„ค์ •์‚ฌํ•ญ coredumb ํŒŒ์ผ ...

<span title='2021-08-23 18:49:15 +0900 KST'>August 23, 2021</span>&nbsp;ยท&nbsp;7 min&nbsp;ยท&nbsp;AswinBlue