๐Ÿ•ท๏ธ Crawler Inspector

URL Lookup

Direct Parameter Lookup

Raw Queries and Responses

1. Shard Calculation

Query:
Response:
Calculated Shard: 143 (from laksa176)

2. Crawled Status Check

Query:
Response:

3. Robots.txt Check

Query:
Response:

4. Spam/Ban Check

Query:
Response:

5. Seen Status Check

โ„น๏ธ Skipped - page is already crawled

๐Ÿšซ
NOT INDEXABLE
โœ…
CRAWLED
7 months ago
๐Ÿค–
ROBOTS ALLOWED

Page Info Filters

FilterStatusConditionDetails
HTTP statusPASSdownload_http_code = 200HTTP 200
Age cutoffFAILdownload_stamp > now() - 6 MONTH7.3 months ago
History dropPASSisNull(history_drop_reason)No drop reason
Spam/banPASSfh_dont_index != 1 AND ml_spam_score = 0ml_spam_score=0
CanonicalPASSmeta_canonical IS NULL OR = '' OR = src_unparsedNot set

Page Details

PropertyValue
URLhttps://eeeuns.github.io/2024/08/09/understandingcomputercompileo/
Last Crawled2025-09-06 08:03:18 (7 months ago)
First Indexednot set
HTTP Status Code200
Meta TitleC์–ธ์–ด๊ฐ€ cpu์— ์ž‘๋™ํ•˜๊ธฐ๊นŒ์ง€ ์‹ฌํ™” : ์ปดํŒŒ์ผ โ€“ eeeuns โ€“ EUnS's blog
Meta Description๊ธฐ๋ณธ๊ธ€
Meta Canonicalnull
Boilerpipe Text
๊ธฐ๋ณธ๊ธ€์„ ์“ฐ๊ณ  ๋‚ด๊ฐ€ ์•„๋Š” ๋ชจ๋“  ๊ฑธ ์“ฐ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์€ ์˜›๋‚ ๋ถ€ํ„ฐ ํ•ด์™”๋‹ค. ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์„ฑ์„ ์ด๋ ‡๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ํ•˜๋ ค๊ณ ํ–ˆ๋Š”๋ฐ.. ์ปดํŒŒ์ผ ๊ณผ์ • ์‹ค์ œ ์‹คํ–‰ ๊ณผ์ • ๋ง์ปค๊ธ€์ด ๊ต‰์žฅํžˆ ๊ดœ์ฐฎ์€ ๊ธ€์ด ์žˆ์–ด์„œ ๋งํฌ๋กœ๋งŒ ๋‹ฌ๊ณ  ํ‰์น˜๊ณ  ์žˆ๋‹ค๊ฐ€, ์ด๋ฒˆ์— ์–ด๋–ค ๊ณ„๊ธฐ๋กœ ์ปดํŒŒ์ผ ๊ณผ์ •์„ ์“ฐ๊ณ  ์žˆ๋‹ค ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ๋งŽ์•„์ง€๊ณ  ์ปดํŒŒ์ผ ๊ธ€์„ ๋‹ค ์™„์„ฑํ•˜๊ณ  ์˜ฌ๋ฆฌ๋ ค๋‹ˆ ์–ธ์ œ ์™„์„ฑ๋ ์ง€ ๊ฐ๋„ ์•ˆ์žกํžˆ๊ธฐ์— ์งœ๋ฅผ์‹œ์ ์— ์ „๋ฐ˜๋ถ€๋ฅผ ์˜ฌ๋ฆฐ๋‹ค..(์˜ˆ์ „ ํ‰์นœ ๊ธ€์€ ๋‚ ๋ ธ๋‹ค) ๊ทธ๋ฆฌ๊ณ  ๋‚จ์€ ๋‚ด์šฉ๋“ค์ด C์–ธ์–ด๊ฐ€ cpu์— ์ž‘๋™ํ•˜๊ธฐ๊นŒ์ง€๋ผ๋Š” ์ฃผ์ œ์— ์ข€ ๋ฒ—์–ด๋‚œ ์–˜๊ธฐ๋“ค์ด๋ผ ๋ณ„๊ฐœ์˜ posting ์œผ๋กœ ์˜ฌ๋ฆฌ๋ ค๊ณ ํ•œ๋‹ค. ์ด๋ฒˆ ๋‚ด์šฉ์€ ๋Œ€๋ถ€๋ถ„ CSAPP ๋ง์ปค ์žฅ์— ํ•ด๋‹นํ•˜๋Š” ๋‚ด์šฉ๋“ค์ด๋‹ค. ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ „์ฒด ์ด๋ฏธ์ง€ ์ € ๊ณผ์ •์ „์ฒด๋ฅผ ํ•ด์ฃผ๋Š” ์ฃผ์ฒด๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๋ผ๊ณ  ํ•œ๋‹ค. (hello.c๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ hello๋ฅผ ๋ฑ‰์–ด์ฃผ๋Š” ์ฃผ์ฒด) ํ˜„์žฌ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ์„ธ ๊ฐœ ์ •๋„๊ฐ€ ์žˆ๋‹ค. MSVC (Microsoft Visual Complier) : windows Visual studio ide๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ Clang GCC ์œ„์˜ ์‚ฌ์ง„์—์„œ ๋ณดํ†ต ๊ฐ€์žฅ ํฌ๊ฒŒ ๋‘ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค ์ปดํŒŒ์ผ์€ ์ƒํ™ฉ์—๋”ฐ๋ผ์„œ ๋„“๊ฑฐ๋‚˜ ์ข์€ ์˜๋ฏธ๋กœ ์“ธ ์ˆ˜ ์žˆ๋Š”๋ฐ ์•„๋ž˜๋กœ ๊ฐˆ์ˆ˜๋ก ์ข์€ ์˜๋ฏธ์ด๋‹ค. ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ์‹คํ–‰ํŒŒ์ผ์„ ๋ฑ‰๋Š” ์ „์ฒด ๊ณผ์ •์„ ํ˜ธ์นญํ•œ๋‹ค. ์œ„ ์ด๋ฏธ์ง€ ์ „์ฒด ๊ณผ์ • ๋งจ ๋งˆ์ง€๋ง‰ ๋ง์ปค๋‹จ๊ณ„๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ตฌ๋ถ„ํ•˜์—ฌ ์ปดํŒŒ์ผ, ๋ง์ปค๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ˜ธ์นญํ•˜๊ธฐ๋„ํ•œ๋‹ค. ๋” ์„ธ๋ถ€์ ์œผ๋กœ ๋งคํฌ๋กœ ์ž‘์—…์ด ๋๋‚œํ›„ ์–ด์…ˆํŒŒ์ผ๋กœ ๋ฑ‰๋Š” ๊ณผ์ •์„ ์ปดํŒŒ์ผ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค. ๊ธ€์—์„œ๋Š” 1, 2์˜ ์˜๋ฏธ๋ฅผ ํ˜ผ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ง์ปค๋ฅผ ์ œ์™ธํ•œ ์ปดํŒŒ์ผ ์ „์ฒด ๊ณผ์ •์„ ํ•œ๋ฒˆ ํ›‘๊ณ  ๋„˜์–ด๊ฐ€์ž. Preprocessor ๋งคํฌ๋กœ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค ์—ฌ๊ธฐ์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ฐ€์ง€๊ณ  ์‹ค์ œ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ํŒŒ์ผ ๊ทธ ์ž์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ข‹๋‹ค. ์ง„์งœ ์ „์ฒ˜๋ฆฌ๋‹ค. #define symbol ์ˆซ์ž ์ด๋Ÿฐ๊ฑฐ๋Š” ์‹ค์ œ symbol์€ ์ˆซ์ž๋กœ ๋ณ€๊ฒฝ๋˜์„œ, ์ฝ”๋“œ์ƒ์˜ ์ •๋ณด๋กœ ๋‚จ์ง€์•Š๊ธฐ์— ๋””๋ฒ„๊น…์‹œ์— ์ฐธ๊ณ ๊ฐ€ ์•„์˜ˆ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ifdef ๋กœ ๊ฑธ๋Ÿฌ์ง„ define์ด๋‚˜ ์ฝ”๋“œ๋“ค์€ ์‹ค์ œ๋กœ ์‹คํ–‰ํŒŒ์ผ์— ์—†๋Š” ์ฝ”๋“œ ๊ฐ€ ๋œ๋‹ค. ๋งค์šฐ ์ค‘์š”ํ•œ ์ •๋ณด, ๋กœ์ง์ด๋ผ์„œ ๋ฐฐํฌ ์‹คํ–‰ํŒŒ์ผ์— ๋“ค์–ด๊ฐ€๋Š”๊ฒƒ์ž์ฒด๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ผ€์ด์Šค๋Š” ์•„์˜ˆ ํ•ด๋‹น ๋‹จ๊ณ„์—์„œ ์ œ์™ธ๋ฅผ ์‹œ์ผœ์„œ, ์•„์˜ˆ ๋ฐฐํฌํŒŒ์ผ์—์„œ ์ œ์™ธ๋ฅผ ์‹œ์ผœ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค. #include๋Š” ์ง„์งœ๋กœ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋‹ค. ํ—ค๋”๋Š” ๊ด€์šฉ์ƒ ๋ถ™์ง€ .h๋ž€ ํ™•์žฅ์ž๊ฐ€ ์•„๋‹ˆ์–ด๋„๋œ๋‹ค. ๊ฐ ๋‹จ๊ณ„๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•œ๋‹ค๋ฉด cpp ํŒŒ์ผ์„ includeํ•ด๋„ ์ž˜ ์ž‘๋™ํ•ด์•ผํ•œ๋‹ค. ์ž‘์€ Cpp ํ”„๋กœ์ ํŠธ๋ฅผ ์ปดํŒŒ์ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์„ธ cppํŒŒ์ผ๊ณผ ์šฐ์ธก์€ stdafx.hํŒŒ์ผ์˜ include ์ƒํƒœ์ด๋‹ค. ์‹ค์ œ ์ „์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ํŒŒ์ผ ํฌ๊ธฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๋‚ด๊ฐ€ ์ž‘์„ฑ์„ 30์ค„์„ ํ•˜๋”๋ผ๋„ ์—ฌ๊ธฐ์— includeํ•˜๋Š” ํ—ค๋”ํŒŒ์ผ์ด 2๋งŒ ์ค„ ์ •๋„ ๋˜๋ฉด ์‹ค์ œ๋กœ๋Š” 2๋งŒ 30์ค„์งœ๋ฆฌ CppํŒŒ์ผ์„ ์ปดํŒŒ์ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋œ๋‹ค. Compiler ์‹ค์ œ๋กœ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ • ์‹คํ–‰ ์ฝ”๋“œ๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์‹ฌ๋ณผ๋“ค์—๋Œ€ํ•ด์„œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ์€ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋‹ค. ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฌผ์ด ์šฐ๋ฆฌ๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ทธ๋‚˜๋งˆ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ์ค‘ ๊ฐ€์žฅ ๊ธฐ๊ณ„์–ด์— ๊ฐ€๊น๋‹ค. ์ž์„ธํžˆ๋Š” ๋ณดํ†ต ์ปดํŒŒ์ผ๋Ÿฌ ์ˆ˜์—…์—์„œ ๋‹ค๋ฃจ๋Š” ๊ตฌ๋ฌธ ๋ถ„์„์ด ์ฃผ์š” ํ•ต์‹ฌ์œผ๋กœ ์ž‘์šฉํ•œ๋‹ค. ์ด ๋‹ค์Œ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ๋ฌผ์€ ์ด์ง„ ํŒŒ์ผ์ด๋‹ค. Assembler ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋ฅผ ์ด์ง„ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ๊ฐ„๋‹จํ•œ ํŒŒ์ผ์€ ์‹คํ–‰ํŒŒ์ผ์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ๊ฒฐ๊ณผ๋ฌผ์„ object ํŒŒ์ผ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹จ์ผ Cpp ํŒŒ์ผ์„ ํ•œ๋ฒˆ์”ฉ ์ปดํŒŒ์ผํ•˜์—ฌ objectํŒŒ์ผ์„ ๋ฝ‘์•„๋‚ด๊ณ  N๊ฐœ์˜ cppํŒŒ์ผ์— ๋Œ€ํ•ด์„œ N๊ฐœ์˜ objectํŒŒ์ผ์„ ๋ฝ‘์•„๋‚ด๊ณ  N๊ฐœ์˜ objectํŒŒ์ผ์„ ๋งํ‚นํ•˜์—ฌ 1๊ฐœ์˜ ์˜จ์ „ํ•œ ์‹คํ–‰ํŒŒ์ผ์„ ๋ฝ‘์•„๋‚ด๋Š” ๊ณผ์ •์ด๋‹ค. ์ž ์—ฌ๊ธฐ๊นŒ์ง€ ์„œ๋ก ์ด ๋๋‚ฌ๋‹ค. object ํŒŒ์ผ์€ ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. reloacatable object file ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ๋ชฉ์ ํŒŒ์ผ ํ•˜์ž๊ฐ€ ์žˆ์–ด์„œ ์‹คํ–‰ํŒŒ์ผ์ด ๋ชป ๋œ ํŒŒ์ผ์ด๋‹ค. a.cpp์„ ์ปดํŒŒ์ผํ–ˆ๋Š”๋ฐ a.cpp ์—์„œ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜ func() ๊ฐ€ b.cpp ํŒŒ์ผ์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ์‹คํ–‰ํŒŒ์ผ์ด ๋  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด๋‹ค. ์ด๋Ÿฐ ๋ชฉ์ ํŒŒ์ผ์„ ๋ชจ์•„์„œ ๋งํ‚น์„ ํ•˜๋ฉด ์‹คํ–‰ ํŒŒ์ผ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค gcc์—์„œ ๋ณดํ†ต .o ํ™•์žฅ์ž์„ ์‚ฌ์šฉํ•˜๊ณ  windows msvc ์—์„œ๋Š” .obj ํŒŒ์ผ ํ™•์žฅ์ž์ด๋‹ค. excuteable object file ์‹คํ–‰ ๊ฐ€๋Šฅ ๋ชฉ์  ํŒŒ์ผ ์‹คํ–‰ ๊ฐ€๋Šฅ ๋ชฉ์  ํŒŒ์ผ์€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ตœ์ข… ๊ฒฐ๊ณผ์ธ ์‹คํ–‰ํŒŒ์ผ์ด๋‹ค. windows์—์„œ๋Š” .exe ํ™•์žฅ์ž, linux์—์„œ๋Š” .out ํ™•์žฅ์ž(๊ผญ ๊ทธ๋ ‡์ง„ ์•Š๋‹ค)์ด๋‹ค. ์‹คํ–‰ ํŒŒ์ผ์„ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์šด์˜์ฒด์ œ์˜ ๋‹ด๋‹น์ธ์ง€๋ผ ํŒŒ์ผ ํ˜•์‹์€ ์šด์˜์ฒด์ œ๊ฐ€ ์ •ํ•œ ํ˜•์‹์— ์ข…์†๋œ๋‹ค. windows์˜ ์‹คํ–‰ ํŒŒ์ผ์€ linux์—์„œ ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. Linking๋‹จ๊ณ„๊นŒ์ง€ ๊ณ ๋ คํ•˜์—ฌ object ํŒŒ์ผ ํฌ๋งท์ด OS์— ์ข…์†๋˜๋Š”๋ฐ linux์—์„œ ๋ชฉ์  ํŒŒ์ผ ํฌ๋งท์€ ELF(Executable and Linkable Format ) ํฌ๋งท์ด ๋ผํ•˜๊ณ  Windows ์—์„œ๋Š” PE Format(Portable Exceuteable)์ด๋ผ ํ•œ๋‹ค. Shared object file ๊ณต์œ  ๋ชฉ์  ํŒŒ์ผ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ ํ”„๋กœ์ ํŠธ ๋งŽ์ด ์•„๋‹Œ ์™„์ „ ํƒ€์ธ์—๊ฒŒ๋„ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ์œ„ํ•ด์„œ ์ž‘์„ฑํ•œ CppํŒŒ์ผ์„ ๋ชจ๋‘ ๋ฐ›์•„์„œ ์ปดํŒŒ์ผ๊นŒ์ง€ ๋งž์ถฐ์„œ ์„ธํŒ…ํ•˜๋Š”๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์‚ฌ์‹ค์€ ๋ณ€๊ฒฝ๋˜์ง€์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š”๊ฒƒ์กฐ์ฐจ ๋น„ํšจ์œจ์ ์ด๋‹ค. ๋ฌถ์ธ ํŒŒ์ผ์„ ํ•˜๋‚˜๋งŒ ์ „๋‹ฌ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€์•Š์„๊นŒ ํ•˜๋Š” ์•„์ด๋””์–ด์—์„œ ์ถœ๋ฐœ ๋’ค์—์„œ ๋” ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช… ์‹ค์ œ PE File ๊ณต์‹ ๋ฌธ์„œ : https://learn.microsoft.com/ko-kr/windows/win32/debug/pe-format?redirectedfrom=MSDN ๋ณธ Windows ์—์„œ ์‹คํ–‰ํŒŒ์ผ์€ ์ด๋ฏธ์ง€/PE(์ด์‹ ๊ฐ€๋Šฅํ•œ ์‹คํ–‰ ํŒŒ์ผ) ํŒŒ์ผ, ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ๋ชฉ์ ํŒŒ์ผ์€ ๊ฐœ์ฒด /COFF(๊ณต์šฉ ๊ฐœ์ฒด ํŒŒ์ผ ํ˜•์‹) ํŒŒ์ผ ์ด๋ผ๊ณ ํ•œ๋‹ค. ์ƒ์„ธํ•˜๊ฒŒ๋Š” ๋ช…์นญ ๋“ฑ ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ ์ „์ฒด์ ์ธ ์„น์…˜ ๊ฐœ์š”๋Š” ELF์™€ ๋น„์Šทํ•œ ๊ตฌ์กฐ์ด๋‹ค. ELF ์žฌ๋ฐฐ์น˜ ํŒŒ์ผ ๊ตฌ์กฐ ๊ฐ ๊ตฌ์—ญ ๋ณ„๋กœ Section์ด ๋‚˜๋‰œ๋‹ค. ๋ชฉ์ ํŒŒ์ผ ์ „์ฒด์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋„ค๊ฐ€์ง€ .bss : ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ „์—ญ๋ณ€์ˆ˜์™€ ์ •์ ๋ณ€์ˆ˜ .data : ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ๋ณ€์ˆ˜ ๋ฐ ์ •์  ๋ณ€์ˆ˜ .rdata : ์ดˆ๊ธฐํ™”๋œ ์ฝ๊ธฐ ์ „์šฉ ๋ฐ์ดํ„ฐ (์ŠคํŠธ๋ง), ์Šค์œ„์น˜ ์ผ€์ด์Šค ์ ํ”„ ํ…Œ์ด๋ธ” .text : ๋ช…๋ น์–ด ๋จธ์‹  ์ฝ”๋“œ ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์—์„œ์˜ ์ต์ˆ™ํ•œ ์š” ๋‚ด์šฉ์— ํ•ด๋‹น ํ•˜๋Š” section์ด๋‹ค. .debug ์„น์…˜ ๋””๋ฒ„๊ทธ ๋””๋ ‰ํ„ฐ๋ฆฌ .debug$F(๊ฐœ์ฒด๋งŒ ํ•ด๋‹น) .debug$S(๊ฐœ์ฒด๋งŒ ํ•ด๋‹น) ์ด ์„น์…˜์—๋Š” Visual C++ ๋””๋ฒ„๊ทธ ์ •๋ณด(์‹ฌ๋ณผ ์ •๋ณด)๊ฐ€ ํฌํ•จ .debug$P(๊ฐœ์ฒด๋งŒ ํ•ด๋‹น) ์ด ์„น์…˜์—๋Š” Visual C++ ๋””๋ฒ„๊ทธ ์ •๋ณด(๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ์ •๋ณด)๊ฐ€ ํฌํ•จ. ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ํ—ค๋”๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผ๋œ ๋ชจ๋“  ๊ฐœ์ฒด ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ํ˜•์‹ .debug$T(๊ฐœ์ฒด๋งŒ ํ•ด๋‹น) ์ด ์„น์…˜์—๋Š” Visual C++ ๋””๋ฒ„๊ทธ ์ •๋ณด(ํ˜•์‹ ์ •๋ณด)๊ฐ€ ํฌํ•จ Microsoft ๋””๋ฒ„๊ทธ ์ •๋ณด์— ๋Œ€ํ•œ ๋ง์ปค ์ง€์› ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ง์ปค์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. .debug$F ,ย  debug$S ,ย  .debug$P ย ๋ฐย  .debug$T ย ์„น์…˜์—์„œ ๋ชจ๋“  ๊ด€๋ จ ๋””๋ฒ„๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ๋ง์ปค์—์„œ ์ƒ์„ฑํ•œ ๋””๋ฒ„๊น… ์ •๋ณด์™€ ํ•จ๊ป˜ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ PDB ํŒŒ์ผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋””๋ฒ„๊ทธ ๋””๋ ‰ํ„ฐ๋ฆฌ ํ•ญ๋ชฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. . edata : (์ด๋ฏธ์ง€๋งŒ ํ•ด๋‹น) : ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐ์ดํ„ฐ ์„น์…˜. ๋‹ค๋ฅธ ์ด๋ฏธ์ง€์—์„œ ๋™์  ๋งํฌ๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๋ณผ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ .reloc ์„น์…˜(์ด๋ฏธ์ง€๋งŒ ํ•ด๋‹น) : ์ด๋ฏธ์ง€์˜ ๋ชจ๋“  ๋ฒ ์ด์Šค ์žฌ๋ฐฐ์น˜์— ๋Œ€ํ•œ ํ•ญ๋ชฉ์ด ํฌํ•จ .drectve (๊ฐœ์ฒด๋งŒ ํ•ด๋‹น) : IMAGE_SCN_LNK_INFO ์„ธํŒ…๋˜์–ด์žˆ์–ด์•ผํ•จ ** ๋ง์ปค ์˜ต์…˜ .idata ์„น์…˜ : ์‹ฌ๋ณผ ๊ฐ€์ ธ์˜ค๊ธฐ ์ •๋ณด .pdata ์„น์…˜ : ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜ ํ…Œ์ด๋ธ” ํ•ญ๋ชฉ์˜ ๋ฐฐ์—ด .tls ์„น์…˜ : ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ํ…Œ์ด๋ธ” ์ฃผ์†Œ ๋ฐ ํฌ๊ธฐ .rsrc ์„น์…˜ : ๋ฆฌ์†Œ์Šค ๋ฐ์ดํ„ฐ (GUI ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ์„น์…˜, ๊ทธ๋ž˜ํ”ฝ ์ •๋ณด ์ €์žฅ) .sxdata ์„น์…˜ .cormeta ์„น์…˜(๊ฐœ์ฒด๋งŒ ํ•ด๋‹น) ๋˜ํ•œ ๊ฐœ์ฒด ํŒŒ์ผ์€ ๊ฐ ์„น์…˜๋งˆ๋‹ค COFF ์žฌ๋ฐฐ์น˜(๊ฐœ์ฒด๋งŒ ํ•ด๋‹น) ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ฃผ์†Œ ์ง€์ •์ด ํ•„์š”ํ•œ ์‹ฌ๋ณผ์„๋‚˜์ค‘์— ํ•ด๋‹น ์‹ฌ๋ณผ์˜ ์ฃผ์†Œ๋ฅผ ์จ๋„ฃ๊ธฐ ์œ„ํ•œ ์ฃผ์†Œ๋ฅผ ๊ธฐ์ž…ํ•˜๊ธฐ ์œ„ํ•œ offset์„ ๊ธฐ๋กํ•˜๋Š” ํ…Œ์ด๋ธ”์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ์ผ ๋งˆ์ง€๋ง‰์— COFF ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•œ๋‹ค ์—ฌ๋Ÿฌ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋กœ ํ•ฉ์ณ๋ฒ„๋ฆฐ๋‹ค. ๋ง์ปค๋Š” ๋‘๋‹จ๊ณ„๋กœ ์ง„ํ–‰๋œ๋‹ค. Symbol resolution ์‹ฌ๋ณผ ํ•ด์„ ๊ฐ ์žฌ๋ฐฐ์น˜ ๋ชฉ์ ํŒŒ์ผ์˜ ์‹ฌ๋ณผํ…Œ์ด๋ธ”์„ ํ•ฉ์ณ์„œ ์™„์ „ํ•œ ํ•˜๋‚˜์˜ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ” ์—”ํŠธ๋ฆฌ๋ฅผ ๊ฐ€์ง„๋‹ค. Relocation ์žฌ๋ฐฐ์น˜ : ์•ž๋‹จ๊ณ„์˜ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ” ์—”ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ์‹ค์ œ๋กœ ์‹ฌ๋ณผ์— ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•œ๋‹ค. ์„น์…˜๊ณผ ์‹ฌ๋ณผ ์ •์˜๋ฅผ ์žฌ๋ฐฐ์น˜ : ๊ฐ ํŒŒ์ผ๋งˆ๋‹ค ๊ฒน์น˜๋Š” ์„น์…˜์„ ํ•˜๋‚˜์˜ ๋‹จ์ผํ™”๋œ ์„น์…˜์œผ๋กœ ํ•ฉ์นœ๋‹ค. ์„น์…˜ ๋‚ด ์‹ฌ๋ณผ ์ฐธ์กฐ๋ฅผ ์žฌ๋ฐฐ์น˜ : ๋ชจ๋“  ์‹ฌ๋ณผ ์ฐธ์กฐ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ •ํ™•ํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋„๋ก ์ž‘์—… ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋‹ค. PC ์ƒ๋Œ€ ์ฐธ์กฐ์˜ ์žฌ๋ฐฐ์น˜ : PC (Program Counter)์„ ๊ธฐ์ค€์œผ๋กœ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹ ์ ˆ๋Œ€ ์ฐธ์กฐ์˜ ์žฌ๋ฐฐ์น˜ : ์ ˆ๋Œ€์ ์ธ ๋ณ€์ˆ˜, ํ•จ์ˆ˜์˜ ์ฃผ์†Ÿ๊ฐ’์„ ์ง์ ‘ ๋ฐ•์•„ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹ ์ด ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ๊ฐ•ํ•œ์‹ฌ๋ณผ๊ณผ ์•ฝํ•œ ์‹ฌ๋ณผ์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋“ฑ์žฅํ•œ๋‹ค. strong symbol ๊ฐ•ํ•œ ์‹ฌ๋ณผ : ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ๋ณ€์ˆ˜ weak symbol ์•ฝํ•œ ์‹ฌ๋ณผ : ์ดˆ๊ธฐํ™”๋˜์ง€์•Š์€ ์ „์—ญ๋ณ€์ˆ˜ ๊ทœ์น™ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ–๋Š” ๋ณต์ˆ˜์˜ ๊ฐ•ํ•œ ์‹ฌ๋ณผ์€ ํ—ˆ์šฉํ•˜์ง€์•Š๋Š”๋‹ค. (์ค‘๋ณตํ•œ strong symbol์€ ์—๋Ÿฌ) ๋™์ผํ•œ ์ด๋ฆ„์˜ ๊ฐ•ํ•œ ์‹ฌ๋ณผ๊ณผ ๋‹ค์ˆ˜์˜ ์•ฝํ•œ ์‹ฌ๋ณผ๋“ค์€ ๊ฐ•ํ•œ ์‹ฌ๋ณผ์„ ํƒํ•œ๋‹ค (strong symbol > weak symbol) ๋™์ผํ•œ ์ด๋ฆ„์˜ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์‹ฌ๋ณผ์€ ์–ด๋–ค ์•ฝํ•œ ์‹ฌ๋ณผ์„ ํƒํ•ด๋„ ์ƒ๊ด€์—†๋‹ค. (weak symbol ์ค‘์—์„  ์ง€ ๋ง˜) ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์ดˆ๊ธฐํ™” ํ•˜์ง€์•Š์€ ๊ฐ™์€ ์ด๋ฆ„์˜ ์ „์—ญ๋ณ€์ˆ˜๊ฐ€ ๊ฐ๊ฐ ์žˆ๋‹ค๋˜๊ฐ€ ํƒ€์ž…์ด ๋‹ค๋ฅธ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ด๋ฆ„์ด ๊ฐ™๋‹ค๋˜๊ฐ€ ๋“ฑ์˜ ์ƒํ™ฉ์€ ์˜๋„ํ•˜์ง€์•Š์€ ๋ฒ„๊ทธ๋ฅผ ์™•์ฐฝ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ „์—ญ๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ตœ๋Œ€ํ•œ static ์„ ๋‹ฌ๊ณ  ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค. ์™ธ๋ถ€์—์„œ ๊ฐ€์ ธ๊ฐ€์„œ ์‚ฌ์šฉ์‹œ์—๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜ ๋ ˆํผ๋Ÿฐ์Šค(or ํฌ์ธํ„ฐ)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Getter ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ˜ธ์ถœํ•˜๋Š”๊ฒƒ์ด ์ •์‹ ๊ฑด๊ฐ•์— ์ด๋กญ๋‹ค. ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ์ปดํŒŒ์ผ๋œ ๋ชฉ์ ํŒŒ์ผ ์ง‘ํ•ฉ๋งŒ ํ•„์š”ํ•˜๋ฉด ๋œ๋‹ค. ํ•„๋“œ๋œ ํŒŒ์ผ ๋˜ํ•œ ์—ฌ๋Ÿฌ๊ฐœ๋ฉด ๋ฒˆ๊ฑฐ๋กœ์šฐ๋‹ˆ ํ†ตํ•ฉ๋œ ํ•œ๊ฐœ์˜ ํŒŒ์ผ๋งŒ ์žˆ์ž๋ผ๊ณ  ์ƒ๊ฐํ•œ๊ฒŒ ๋ฐ”๋กœ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. ์ตœ์ดˆ์˜ ์ปดํŒŒ์ผ ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ๋งŒ ๊ฐ€์ง€๊ณ , ๋งํ‚น์‹œ์— ํ•ฉ์น˜๊ธฐํ•ด์„œ ์ตœ์ข… ์‹คํ–‰ํŒŒ์ผ์— ์‹คํ–‰ํŒŒ์ผ์— ๋ชจ๋“ ๊ฒƒ์ด ๋‹ค ๋“ค์–ด๊ฐ€์žˆ๋‹ค. (์‹คํ–‰ํŒŒ์ผ ์šฉ๋Ÿ‰๋„ ๊ทธ๋งŒํผ ์ฆ๊ฐ€) ๊ทธ๋ž˜์„œ ๋‚ด์šฉ๋ฌผ์„ ๋ฌถ์–ด ํ•˜๋‚˜์˜ object file๋งŒ๋“ค๊ณ , ํ—ค๋”ํŒŒ์ผ์„ ์ œ๊ณต โ†’ ์‚ฌ์šฉ์ž๋Š” ํ—ค๋” ํŒŒ์ผ์„ includeํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ง์ปค ๋‹จ๊ณ„์—์„œ ๋ฌถ์Œ object file์„ ํ†ตํ•ด ์‹คํ–‰ํŒŒ์ผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” .a ์œˆ๋„์šฐ์ฆˆ์—์„œ๋Š” .lib ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ( Widows DLL ref ) static lib๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ ๋ณด๋ฉด ๊ตฐ๋”๋”๊ธฐ ์—†์ด ๊น”๋”ํ•œ ๋ฐฉ์‹์ด๋‹ค. ํ•˜์ง€๋งŒ, ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ์„ ์ •๋ง ๋งŽ์€ ์‹คํ–‰ ํŒŒ์ผ์—์„œ ๋™์‹œ์— ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ์‹คํ–‰ํŒŒ์ผ์— ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งํ‚นํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜๋„์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ จ๋œ ๊ฒƒ์ด ๊ฐœ๋ณ„ ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ ๋  ๊ฒƒ์ด๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ „์ฒด์˜ ์ž…์žฅ์—์„œ๋ณด๋ฉด ๋™์ผํ•œ ์ฝ”๋“œ ๋กœ์ง์ด ํ”„๋กœ์„ธ์Šค ๋ณ„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ชจ๋‘ ์˜ฌ๋ผ๊ฐ€ ์žˆ๋Š” ์…ˆ์ด๋‹ค. ์ถ”๊ฐ€๋กœ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ์‹คํ–‰ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ปค์ง„๋‹ค. ์ด๊ฒŒ ๋น„ํšจ์œจ์ ์ด๋ผ ํŒ๋‹จํ•˜์—ฌ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ํ•œ๋ฒˆ๋งŒ ์ ์žฌํ•˜๊ณ  ์—ฌ๋Ÿฌ ์‹คํ–‰ํŒŒ์ผ์—์„œ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐ๋งŒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์กฐ๋ฅผ ์žก์•˜๋‹ค. ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” .so ํŒŒ์ผ ํ™•์žฅ์ž๋กœ ์œˆ๋„์šฐ์ฆˆ์—์„œ ํ”ํžˆ๋งํ•˜๋Š” DLL ํ™•์žฅ์ž ํŒŒ์ผ์ด ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•œ๋‹ค. ์ž‘๋™๋ฐฉ์‹์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค. implicit load-time linking : Loader๊ฐ€ ํ”„๋กœ์„ธ์Šค์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์žฌํ•˜๋Š” ๋•Œ์— DLL๋„ ๊ฐ™์ด ์ ์žฌ๋ฅผ ํ•œ๋‹ค. ์ด๋•Œ ์ด ์ž‘์—…์„ ํ•˜๋Š” ์ฃผ์ฒด๋ฅผ Dynamic linker๋ผ ํ•œ๋‹ค. DLL ์„ ์ฒ˜์Œ์— ์ƒ์„ฑ์‹œ์— ๋‘๊ฐ€์ง€ ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด์ง„๋‹ค dll, lib ํŒŒ์ผ dll์ด ์‹ค์ œ ๋Œ€๋ถ€๋ถ„์˜ mainํ•จ์ˆ˜์—†๋Š” ํŒŒ์ผ์ด๊ณ , ์‹ค์ œ ๋กœ๋”ฉ์‹œ์— ์‚ฌ์šฉ (dll ํŒŒ์ผ์ด ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋Š” .edata ์„น์…˜์— ์กด์žฌํ•œ๋‹ค ) lib ํŒŒ์ผ์€ ๋งํ‚น์‹œ์— ์‚ฌ์šฉ ์ฐธ์กฐ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ•  ๋งํ‚น์‹œ์— ์‚ฌ์šฉ ํ•จ์ˆ˜์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋‹น์—ฐํžˆ ๋งํ‚น์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋•Œ .lib ํŒŒ์ผ์ด ๋งํ‚น์‹œ์— ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๊ตฌํ˜„์ฒด๊ฐ€ DLL์— ์žˆ์Œ์„ ์ธ์ง€ํ•œ๋‹ค. (์ด์— ๋Œ€ํ•œ ์ •๋ณด๋Š” . idata ์„น์…˜์— ์กด์žฌํ•œ๋‹ค ) ๊ทธ๋Ÿฌ๊ณ  ํŒŒ์ผ ์‹คํ–‰์‹œ์— ๋กœ๋”๊ฐ€ ํ•ด๋‹น DLLํŒŒ์ผ์„ ์‹ค์ œ๋กœ ๋กœ๋“œํ•˜๋ฉด์„œ ํ•จ์ˆ˜์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ฒŒํ•œ๋‹ค. ์‹คํ–‰ํ•˜์ž๋งˆ์ž dll ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋œฐ๊ฑฐ๋‹ค. explicit run-time linking : ์†Œ์ŠคํŒŒ์ผ์—์„œ ์ง์ ‘ DLL open(dlopen, LoadLibrary) ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ DLL์„ ๋กœ๋”ฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ•˜์—ฌ DLL์„ ์ž‘์„ฑ ์ฝ”๋“œ ๋กœ์ง์ƒ ์ง์ ‘ ๋กœ๋“œ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋กœ๋“œํ•œ DLL์—์„œ ํŠน์ • ํ•จ์ˆ˜๋ช…์— ๋”ฐ๋ฅธ ์ง์ ‘ ํ•จ์ˆ˜ ์ฃผ์†Œ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ํ•จ์ˆ˜ํฌ์ธํ„ฐ๋กœ ์ €์žฅํ•˜๊ณ  ์ด ํ•จ์ˆ˜ํฌ์ธํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ„์ ‘์‚ฌ์šฉํ•œ๋‹ค. ๋‹น์—ฐํžˆ ์ปดํŒŒ์ผ๋‹จ์—์„œ๋Š” ์–ด๋–ค DLL์„ ๋กœ๋“œํ•˜๋Š”์ง€, ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์ปดํŒŒ์ผํƒ€์ž„์— ํŒŒ์•…์ด ๋ถˆ๊ฐ€๋Šฅ ํ•˜์—ฌ ์‹คํ–‰ํŒŒ์ผ์€ ๋ณธ์ธ์ด DLL์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์กฐ์ฐจ ์•Œ ์ˆ˜ ์—†๋‹ค. ๋ชจ๋“ˆ ์ตœ์‹  ์–ธ์–ด๋“ค์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• include๋”ฐ์œ„๋Š” ์ •๋ง ์˜›๋‚  ์–ธ์–ด์—๋‚˜ ํ•ด๋‹น ๊ธฐ๋Šฅ์ด๋‹ค. ์ตœ์‹  ์–ธ์–ด์—๋Š” ๋ชจ๋“ˆ ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋‹ค. include๋Š” ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ํ—ค๋”ํŒŒ์ผ ์ „์ฒด ๋ฅผ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐํ•œ๋‹ค. cpp ๊ฐœ๋ณ„ ํŒŒ์ผ ๊ธฐ์ค€์œผ๋กœ ๋ณด๋ฉด ๋ชจ๋“  ํ—ค๋” ํŒŒ์ผ์— ์žˆ๋Š” ๋ชจ๋“  ์ •๋ณด๊ฐ€ ํ•„์š”ํ•  ์ผ์€ ๋ณดํ†ต ์—†๋‹ค. ์š” ํ—ค๋” ํŒŒ์ผ์กฐ์ฐจ ์ชผ๊ฐœ์„œ ํŠน์ • ํ•จ์ˆ˜ ํ•˜๋‚˜๋งŒ ๊ฐ€์ ธ๋‹ค ์“ฐ์ž๋ผ๋Š” ๋ฐฉ์•ˆ์—์„œ ์ƒ๊ฒจ๋‚ฌ๋‹ค. ์ž ์ง์ ‘ ํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณด์ž 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 static int staticVar = 0x12345678 ; void func1 (); void func () { staticVar ++ ; } int global = 0x12abcdef ; const char * str = " Hello " ; int main () { staticVar ++ ; func1 (); } func1 ํŒŒ์ผ์ด ์—†์–ด์„œ ๋‹น์—ฐํžˆ ๋ง์ปค์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ ํ•œ๋‹ค. ๊ทธ๋Ÿผ objํŒŒ์ผ์€ ์ƒ์„ฑ ๋˜์–ด์žˆ์œผ๋‹ˆ ์š” obj ํŒŒ์ผ์„ ํ•œ๋ฒˆ PEView ๋กœ ์—ด์–ด๋ณด์ž ๋ช…์‹ฌํ•˜์ž ํŒŒ์ผ์€ ๊ฒฐ๊ตญ ๊ทธ๋ƒฅ ์ด์ง„์ˆ˜ ๋ฉ์–ด๋ฆฌ๋‹ค. PEView๋„ ๊ฒฐ๊ตญ์— ์ด์ง„ ๋ช…๋ น์–ด๋ฅผ ๋ถ„์„ํ•ด๋ดค์œผ๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ์ด์ง„ ๋ฉ์–ด๋ฆฌ๋ฅผ ๊ทœ์น™์—๋”ฐ๋ผ ๊ทธ๋ƒฅ ๋ช‡๋ฐ”์ดํŠธ ์”ฉ์ฝ๊ณ  ํ•ด์„ ํ•ด๋†“์€ ๊ฒƒ์— ๋ถˆ๊ณผํ•˜๋‹ค. ๊ทœ์น™๋งŒ ์žˆ์œผ๋ฉด ์šฐ๋ฆฌ๋„ PEView๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค drectve : ๋ง์ปค์˜ต์…˜์ด ๋“ค์–ด์žˆ๋‹ค data : ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ๋ณ€์ˆ˜ ๋ฐ ์ •์  ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋“ค์–ด์žˆ๋‹ค. global ๋ฐ staticVAr rdata ์ดˆ๊ธฐํ™”๋œ ์ฝ๊ธฐ ์ „์šฉ ๋ฐ์ดํ„ฐ (์ŠคํŠธ๋ง) ์ž ์ด์ œ ์–ด์…ˆ์„ ๊นŒ๋ณด์ž ์–ด์…ˆ์€ PE View์—์„œ ๋ชป๋ณด๋Š” ๋“ฏํ•ด์„œ ๋‹ค๋ฅธ ํˆด์„ ์ฐพ์•„๋ดค์„๋•Œ ๊ณต์‹์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ์ค‘์—๋Š” Visual Studio msvc ๋‚ด์žฅ ํˆด์ธ dumpbin.exe ์œผ๋กœ ์ง์ ‘ ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ํˆด์ธ ๋งŒํผ ๊ฐ€์žฅ ์ •ํ™•ํ•˜๊ณ  ํ™•์‹คํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. visual studio ์„ค์น˜ ํด๋”์•ˆ์—์„œ ํ•ด๋‹น ํŒŒ์ผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋‚˜์˜จ๋‹ค. ์ด ํˆด์„ ํ†ตํ•ด์„œ obj text section์„ Disasmํ•œ ๊ฒฐ๊ณผ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค 1 dumpbin . exe / all ๊ฒฝ๋กœ / ํŒŒ์ผ . obj 1 dumpbin . exe / DISASM ๊ฒฝ๋กœ / ํŒŒ์ผ . obj 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 Microsoft ( R ) COFF / PE Dumper Version 14.39 . 33522.0 Copyright ( C ) Microsoft Corporation . All rights reserved . Dump of file File Type : COFF OBJECT ? func @@ YAXXZ ( void __cdecl func ( void )): 0000000000000000 : 40 55 push rbp 0000000000000002 : 57 push rdi 0000000000000003 : 48 81 EC E8 00 00 sub rsp , 0 E8h 00 000000000000000 A : 48 8 D 6 C 24 20 lea rbp ,[ rsp + 20 h ] 000000000000000 F : 48 8 D 0 D 00 00 00 lea rcx ,[ __416313BE_testproject @ cpp ] 00 0000000000000016 : E8 00 00 00 00 call __CheckForDebuggerJustMyCode 000000000000001 B : 8 B 05 00 00 00 00 mov eax , dword ptr [? staticVar @@ 3HA ] 0000000000000021 : FF C0 inc eax 0000000000000023 : 89 05 00 00 00 00 mov dword ptr [? staticVar @@ 3HA ], eax 0000000000000029 : 48 8 D A5 C8 00 00 lea rsp ,[ rbp + 0 C8h ] 00 0000000000000030 : 5 F pop rdi 0000000000000031 : 5 D pop rbp 0000000000000032 : C3 ret __JustMyCode_Default : 0000000000000000 : C2 00 00 ret 0 main : 0000000000000000 : 40 55 push rbp 0000000000000002 : 57 push rdi 0000000000000003 : 48 81 EC E8 00 00 sub rsp , 0 E8h 00 000000000000000 A : 48 8 D 6 C 24 20 lea rbp ,[ rsp + 20 h ] 000000000000000 F : 48 8 D 0 D 00 00 00 lea rcx ,[ __416313BE_testproject @ cpp ] 00 0000000000000016 : E8 00 00 00 00 call __CheckForDebuggerJustMyCode 000000000000001 B : 8 B 05 00 00 00 00 mov eax , dword ptr [? staticVar @@ 3HA ] 0000000000000021 : FF C0 inc eax 0000000000000023 : 89 05 00 00 00 00 mov dword ptr [? staticVar @@ 3HA ], eax 0000000000000029 : E8 00 00 00 00 call ? func1 @@ YAXXZ 000000000000002 E : 33 C0 xor eax , eax 0000000000000030 : 48 8 D A5 C8 00 00 lea rsp ,[ rbp + 0 C8h ] 00 0000000000000037 : 5 F pop rdi 0000000000000038 : 5 D pop rbp 0000000000000039 : C3 ret Summary 98 . chks64 14 . data 34 C . debug$S 64 . debug$T 82 . drectve 1 . msvcjmc 18 . pdata 6 . rdata 8 . rtc$IMZ 8 . rtc$TMZ 70 . text$mn 20 . xdata ์–ด์…ˆ์ƒ์— ์‹ค์ œ๋กœ ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ•œ ๊ณณ์€ ๋ชจ๋‘ 0์œผ๋กœ ๋ฐ€๋ ค์žˆ๋‹ค. ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ disasemble๋กœ ๋ณ€์ˆ˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ง‘์–ด๋ƒˆ์„๊นŒ? ํ•ด๋‹น ์ •๋ณด๋“ค์€ ๊ฐœ๋ณ„๋กœ COFF ์žฌ๋ฐฐ์น˜ ํ…Œ์ด๋ธ”์— ์กด์žฌํ•œ๋‹ค. 1 2 3 4 5 6 7 8 9 10 RELOCATIONS # A Symbol Symbol Offset Type Applied To Index Name -------- ---------------- ----------------- -------- ------ 00000012 REL32 00000000 15 __416313BE_testproject @ cpp 00000017 REL32 00000000 2 D __CheckForDebuggerJustMyCode 0000001 D REL32 00000000 41 ? staticVar @@ 3HA ( int staticVar ) 00000025 REL32 00000000 41 ? staticVar @@ 3HA ( int staticVar ) 0000002 A REL32 00000000 28 ? func1 @@ YAXXZ ( void __cdecl func1 ( void )) ์ตœ์ข…์ ์ธ ์ „์ฒด ํ•ด๋‹น OBJ์˜ COFF SYMBOL TABLE ์ด๋‹ค 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 COFF SYMBOL TABLE 000 010582 F2 ABS notype Static | @ comp . id 001 80010390 ABS notype Static | @ feat . 00 002 00000002 ABS notype Static | @ vol . md 003 00000000 SECT1 notype Static | . drectve Section length 82 , # relocs 0 , # linenums 0 , checksum 0 Relocation CRC 00000000 006 00000000 SECT2 notype Static | . debug$S Section length 1 A0 , # relocs 8 , # linenums 0 , checksum 0 Relocation CRC 6 F82BF45 009 00000000 SECT3 notype Static | . data Section length 14 , # relocs 1 , # linenums 0 , checksum 9 BE618FC Relocation CRC D3D0C3E9 00 C 00000000 SECT3 notype External | ? global @@ 3HA ( int global ) 00 D 00000008 SECT3 notype External | ? str @@ 3PEBDEB ( char const * const str ) 00 E 00000000 SECT4 notype Static | . rdata Section length 6 , # relocs 0 , # linenums 0 , checksum 60817 DAB , selection 2 ( pick any ) Relocation CRC 00000000 011 00000000 SECT4 notype External | ?? _C @ _05COLMCDPH @ Hello @ ( `string') 012 00000000 SECT5 notype Static | .msvcjmc Section length 1, #relocs 0, #linenums 0, checksum 77073096 Relocation CRC 00000000 015 00000000 SECT5 notype Static | __416313BE_testproject@cpp 016 00000000 SECT6 notype Static | .text$mn Section length 33, #relocs 4, #linenums 0, checksum 8A2C0D07, selection 1 (pick no duplicates) Relocation CRC 64879072 019 00000000 SECT7 notype Static | .debug$S Section length 9C, #relocs 4, #linenums 0, checksum 0, selection 5 (pick associative Section 0x6) Relocation CRC BD630DA2 01C 00000000 SECT8 notype Static | .text$mn Section length 3, #relocs 0, #linenums 0, checksum 922B422E, selection 2 (pick any) Relocation CRC 4A6A8444 01F 00000000 SECT9 notype Static | .debug$S Section length 6C, #relocs 2, #linenums 0, checksum 0, selection 5 (pick associative Section 0x8) Relocation CRC C5009019 022 00000000 SECTA notype Static | .text$mn Section length 3A, #relocs 5, #linenums 0, checksum AAA72B5C, selection 1 (pick no duplicates) Relocation CRC A65313CD 025 00000000 SECTB notype Static | .debug$S Section length A4, #relocs 4, #linenums 0, checksum 0, selection 5 (pick associative Section 0xA) Relocation CRC 16E24314 028 00000000 UNDEF notype () External | ?func1@@YAXXZ (void __cdecl func1(void)) 029 00000000 SECT6 notype () External | ?func@@YAXXZ (void __cdecl func(void)) 02A 00000000 SECTA notype () External | main 02B 00000000 UNDEF notype () External | _RTC_InitBase 02C 00000000 UNDEF notype () External | _RTC_Shutdown 02D 00000000 UNDEF notype () External | __CheckForDebuggerJustMyCode 02E 00000000 SECT8 notype () External | __JustMyCode_Default 02F 00000000 SECT6 notype Label | $LN3 030 00000000 SECTA notype Label | $LN3 031 00000000 SECTC notype Static | .xdata Section length 10, #relocs 0, #linenums 0, checksum E3EC660A, selection 5 (pick associative Section 0x6) Relocation CRC 00000000 034 00000000 SECTC notype Static | $unwind$?func@@YAXXZ 035 00000000 SECTD notype Static | .pdata Section length C, #relocs 3, #linenums 0, checksum B42549E, selection 5 (pick associative Section 0x6) Relocation CRC 51E35C8D 038 00000000 SECTD notype Static | $pdata$?func@@YAXXZ 039 00000000 SECTE notype Static | .xdata Section length 10, #relocs 0, #linenums 0, checksum E3EC660A, selection 5 (pick associative Section 0xA) Relocation CRC 00000000 03C 00000000 SECTE notype Static | $unwind$main 03D 00000000 SECTF notype Static | .pdata Section length C, #relocs 3, #linenums 0, checksum 140D4FB5, selection 5 (pick associative Section 0xA) Relocation CRC 70AAD6AF 040 00000000 SECTF notype Static | $pdata$main 041 00000010 SECT3 notype Static | ?staticVar@@3HA (int staticVar) 042 00000000 SECT10 notype Static | .rtc$IMZ Section length 8, #relocs 1, #linenums 0, checksum 0, selection 2 (pick any) Relocation CRC BB70974B 045 00000000 SECT10 notype Static | _RTC_InitBase.rtc$IMZ 046 00000000 SECT11 notype Static | .rtc$TMZ Section length 8, #relocs 1, #linenums 0, checksum 0, selection 2 (pick any) Relocation CRC AACEFC19 049 00000000 SECT11 notype Static | _RTC_Shutdown.rtc$TMZ 04A 00000000 SECT12 notype Static | .debug$T Section length 64, #relocs 0, #linenums 0, checksum 0 Relocation CRC 00000000 04D 00000000 SECT13 notype Static | .chks64 Section length 98, #relocs 0, #linenums 0, checksum 0 Relocation CRC 00000000 ์ค‘๊ฐ„์˜ Static, External, Label ๋Š” ์„ค๋ช…์ด ์—†์–ด๋„ ๊ฐ๊ฐ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์„๊ฑฐ๋ผ ์ƒ๊ฐํ•œ๋‹ค ๋งํฌ์—๋Ÿฌ๋ฅผ ๋ฑ‰์€ func1 ์„ ์ง€์šฐ๊ณ  ์ปดํŒŒ์ผ์„ ํ–ˆ์„๋•Œ ์ตœ์ข… ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ์˜ main ํ•จ์ˆ˜ disasm ์ด๋‹ค 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 main : 00000001400117 C0 : 40 55 push rbp 00000001400117 C2 : 57 push rdi 00000001400117 C3 : 48 81 EC E8 00 00 sub rsp , 0 E8h 00 00000001400117 CA : 48 8 D 6 C 24 20 lea rbp ,[ rsp + 20 h ] 00000001400117 CF : 48 8 D 0 D 2 A F8 00 lea rcx ,[ 140021000 h ] 00 00000001400117 D6 : E8 7 C FB FF FF call @ ILT + 850 ( __CheckForDebuggerJustMyCode ) 00000001400117 DB : 8 B 05 2 F A8 00 00 mov eax , dword ptr [ 14001 C010h ] 00000001400117 E1 : FF C0 inc eax 00000001400117 E3 : 89 05 27 A8 00 00 mov dword ptr [ 14001 C010h ], eax 00000001400117 E9 : 33 C0 xor eax , eax 00000001400117 EB : 48 8 D A5 C8 00 00 lea rsp ,[ rbp + 0 C8h ] 00 00000001400117 F2 : 5 F pop rdi 00000001400117 F3 : 5 D pop rbp 00000001400117 F4 : C3 ret ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋“ค์˜ ์ฃผ์†Œ๋ฅผ ์ ˆ๋Œ€ ์ฐธ์กฐํ•˜์—ฌ ์žฌ๋ฐฐ์น˜ํ•˜์˜€๋‹ค. notepad์˜ import ํŒŒ์ผ์„ ํ•œ๋ฒˆ ๋ณด์ž. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 dumpbin / imports C : \ Windows \ System32 \ notepad . exe Microsoft ( R ) COFF / PE Dumper Version 14.39 . 33522.0 Copyright ( C ) Microsoft Corporation . All rights reserved . Dump of file C : \ Windows \ System32 \ notepad . exe File Type : EXECUTABLE IMAGE Section contains the following imports : KERNEL32 . dll 1400268 B8 Import Address Table 14002 D3E0 Import Name Table 0 time date stamp 0 Index of first forwarder reference 2 B8 GetProcAddress DC CreateMutexExW 1 AcquireSRWLockShared 114 DeleteCriticalSection GDI32 . dll 140026800 Import Address Table 14002 D328 Import Name Table 0 time date stamp 0 Index of first forwarder reference USER32 . dll 140026 B50 Import Address Table 14002 D678 Import Name Table 0 time date stamp 0 Index of first forwarder reference api - ms - win - crt - string - l1 - 1 - 0 . dll 140027088 Import Address Table 14002 DBB0 Import Name Table 0 time date stamp 0 Index of first forwarder reference 83 memset A9 wcsnlen 9 E wcscmp api - ms - win - crt - runtime - l1 - 1 - 0 . dll 140027060 Import Address Table 14002 DB88 Import Name Table 0 time date stamp 0 Index of first forwarder reference 15 _c_exit 3 D _register_thread_local_exe_atexit_callback 37 _initterm_e 36 _initterm api - ms - win - crt - private - l1 - 1 - 0 . dll 140026 F40 Import Address Table 14002 DA68 Import Name Table 0 time date stamp 0 Index of first forwarder reference 91 _o__callnewh 93 _o__cexit 9 F _o__configthreadlocale api - ms - win - core - com - l1 - 1 - 0 . dll 140026 D80 Import Address Table 14002 D8A8 Import Name Table 0 time date stamp 0 Index of first forwarder reference 49 CoWaitForMultipleHandles 46 CoUninitialize api - ms - win - core - shlwapi - legacy - l1 - 1 - 0 . dll 140026 E68 Import Address Table 14002 D990 Import Name Table 0 time date stamp 0 Index of first forwarder reference .... Summary 3000 . data 1000 . didat 2000 . pdata A000 . rdata 1000 . reloc 1000 . rsrc 25000 . text ๋Œ€์ถฉ ์ด๋Ÿฐ๋А๋‚Œ์ด๋‹ค.
Markdown
[![](https://avatars0.githubusercontent.com/u/42970615?s=460&u=e645a705a149c9ebf4f57f559ddaeea007ba01d8&v=4)](https://eeeuns.github.io/) # [eeeuns](https://eeeuns.github.io/) EUnSโ€™s blog [Recent](https://eeeuns.github.io/) [Date](https://eeeuns.github.io/archive) [Tag](https://eeeuns.github.io/tags) [About](https://eeeuns.github.io/about) # [C์–ธ์–ด๊ฐ€ cpu์— ์ž‘๋™ํ•˜๊ธฐ๊นŒ์ง€ ์‹ฌํ™” : ์ปดํŒŒ์ผ](https://eeeuns.github.io/2024/08/09/understandingcomputercompileo/) - [๊ธฐ๋ณธ๊ธ€](https://eeeuns.github.io/2021/10/27/understandingcomputer/) ๊ธฐ๋ณธ๊ธ€์„ ์“ฐ๊ณ  ๋‚ด๊ฐ€ ์•„๋Š” ๋ชจ๋“  ๊ฑธ ์“ฐ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์€ ์˜›๋‚ ๋ถ€ํ„ฐ ํ•ด์™”๋‹ค. ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์„ฑ์„ ์ด๋ ‡๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ํ•˜๋ ค๊ณ ํ–ˆ๋Š”๋ฐ.. 1. ์ปดํŒŒ์ผ ๊ณผ์ • 2. ์‹ค์ œ ์‹คํ–‰ ๊ณผ์ • ๋ง์ปค๊ธ€์ด ๊ต‰์žฅํžˆ ๊ดœ์ฐฎ์€ ๊ธ€์ด ์žˆ์–ด์„œ ๋งํฌ๋กœ๋งŒ ๋‹ฌ๊ณ  ํ‰์น˜๊ณ  ์žˆ๋‹ค๊ฐ€, ์ด๋ฒˆ์— ์–ด๋–ค ๊ณ„๊ธฐ๋กœ ์ปดํŒŒ์ผ ๊ณผ์ •์„ ์“ฐ๊ณ  ์žˆ๋‹ค ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ๋งŽ์•„์ง€๊ณ  ์ปดํŒŒ์ผ ๊ธ€์„ ๋‹ค ์™„์„ฑํ•˜๊ณ  ์˜ฌ๋ฆฌ๋ ค๋‹ˆ ์–ธ์ œ ์™„์„ฑ๋ ์ง€ ๊ฐ๋„ ์•ˆ์žกํžˆ๊ธฐ์— ์งœ๋ฅผ์‹œ์ ์— ์ „๋ฐ˜๋ถ€๋ฅผ ์˜ฌ๋ฆฐ๋‹ค..(์˜ˆ์ „ ํ‰์นœ ๊ธ€์€ ๋‚ ๋ ธ๋‹ค) ๊ทธ๋ฆฌ๊ณ  ๋‚จ์€ ๋‚ด์šฉ๋“ค์ด C์–ธ์–ด๊ฐ€ cpu์— ์ž‘๋™ํ•˜๊ธฐ๊นŒ์ง€๋ผ๋Š” ์ฃผ์ œ์— ์ข€ ๋ฒ—์–ด๋‚œ ์–˜๊ธฐ๋“ค์ด๋ผ ๋ณ„๊ฐœ์˜ [posting](https://eeeuns.github.io/2024/09/03/reducebuild/)์œผ๋กœ ์˜ฌ๋ฆฌ๋ ค๊ณ ํ•œ๋‹ค. ์ด๋ฒˆ ๋‚ด์šฉ์€ ๋Œ€๋ถ€๋ถ„ CSAPP ๋ง์ปค ์žฅ์— ํ•ด๋‹นํ•˜๋Š” ๋‚ด์šฉ๋“ค์ด๋‹ค. *** ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ „์ฒด ์ด๋ฏธ์ง€ ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/Untitled.png) ์ € ๊ณผ์ •์ „์ฒด๋ฅผ ํ•ด์ฃผ๋Š” ์ฃผ์ฒด๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๋ผ๊ณ  ํ•œ๋‹ค. (hello.c๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ hello๋ฅผ ๋ฑ‰์–ด์ฃผ๋Š” ์ฃผ์ฒด) ํ˜„์žฌ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ์„ธ ๊ฐœ ์ •๋„๊ฐ€ ์žˆ๋‹ค. - MSVC (Microsoft Visual Complier) : windows Visual studio ide๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ - Clang - GCC ์œ„์˜ ์‚ฌ์ง„์—์„œ ๋ณดํ†ต ๊ฐ€์žฅ ํฌ๊ฒŒ ๋‘ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค ์ปดํŒŒ์ผ์€ ์ƒํ™ฉ์—๋”ฐ๋ผ์„œ ๋„“๊ฑฐ๋‚˜ ์ข์€ ์˜๋ฏธ๋กœ ์“ธ ์ˆ˜ ์žˆ๋Š”๋ฐ ์•„๋ž˜๋กœ ๊ฐˆ์ˆ˜๋ก ์ข์€ ์˜๋ฏธ์ด๋‹ค. 1. ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ์‹คํ–‰ํŒŒ์ผ์„ ๋ฑ‰๋Š” ์ „์ฒด ๊ณผ์ •์„ ํ˜ธ์นญํ•œ๋‹ค. ์œ„ ์ด๋ฏธ์ง€ ์ „์ฒด ๊ณผ์ • 2. ๋งจ ๋งˆ์ง€๋ง‰ ๋ง์ปค๋‹จ๊ณ„๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ตฌ๋ถ„ํ•˜์—ฌ ์ปดํŒŒ์ผ, ๋ง์ปค๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ˜ธ์นญํ•˜๊ธฐ๋„ํ•œ๋‹ค. 3. ๋” ์„ธ๋ถ€์ ์œผ๋กœ ๋งคํฌ๋กœ ์ž‘์—…์ด ๋๋‚œํ›„ ์–ด์…ˆํŒŒ์ผ๋กœ ๋ฑ‰๋Š” ๊ณผ์ •์„ ์ปดํŒŒ์ผ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค. ๊ธ€์—์„œ๋Š” 1, 2์˜ ์˜๋ฏธ๋ฅผ ํ˜ผ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ง์ปค๋ฅผ ์ œ์™ธํ•œ ์ปดํŒŒ์ผ ์ „์ฒด ๊ณผ์ •์„ ํ•œ๋ฒˆ ํ›‘๊ณ  ๋„˜์–ด๊ฐ€์ž. # Compile ## Preprocessor 1. **๋งคํฌ๋กœ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค** 2. ์—ฌ๊ธฐ์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ฐ€์ง€๊ณ  **์‹ค์ œ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ํŒŒ์ผ** ๊ทธ ์ž์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ข‹๋‹ค. ์ง„์งœ ์ „์ฒ˜๋ฆฌ๋‹ค. \#define symbol ์ˆซ์ž ์ด๋Ÿฐ๊ฑฐ๋Š” ์‹ค์ œ symbol์€ ์ˆซ์ž๋กœ ๋ณ€๊ฒฝ๋˜์„œ, ์ฝ”๋“œ์ƒ์˜ ์ •๋ณด๋กœ ๋‚จ์ง€์•Š๊ธฐ์— ๋””๋ฒ„๊น…์‹œ์— ์ฐธ๊ณ ๊ฐ€ ์•„์˜ˆ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ifdef ๋กœ ๊ฑธ๋Ÿฌ์ง„ define์ด๋‚˜ ์ฝ”๋“œ๋“ค์€ ์‹ค์ œ๋กœ **์‹คํ–‰ํŒŒ์ผ์— ์—†๋Š” ์ฝ”๋“œ**๊ฐ€ ๋œ๋‹ค. ๋งค์šฐ ์ค‘์š”ํ•œ ์ •๋ณด, ๋กœ์ง์ด๋ผ์„œ ๋ฐฐํฌ ์‹คํ–‰ํŒŒ์ผ์— ๋“ค์–ด๊ฐ€๋Š”๊ฒƒ์ž์ฒด๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ผ€์ด์Šค๋Š” ์•„์˜ˆ ํ•ด๋‹น ๋‹จ๊ณ„์—์„œ ์ œ์™ธ๋ฅผ ์‹œ์ผœ์„œ, ์•„์˜ˆ ๋ฐฐํฌํŒŒ์ผ์—์„œ ์ œ์™ธ๋ฅผ ์‹œ์ผœ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค. **\#include๋Š” ์ง„์งœ๋กœ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋‹ค.** ํ—ค๋”๋Š” ๊ด€์šฉ์ƒ ๋ถ™์ง€ .h๋ž€ ํ™•์žฅ์ž๊ฐ€ ์•„๋‹ˆ์–ด๋„๋œ๋‹ค. ๊ฐ ๋‹จ๊ณ„๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•œ๋‹ค๋ฉด cpp ํŒŒ์ผ์„ includeํ•ด๋„ ์ž˜ ์ž‘๋™ํ•ด์•ผํ•œ๋‹ค. ์ž‘์€ Cpp ํ”„๋กœ์ ํŠธ๋ฅผ ์ปดํŒŒ์ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/img1.png) ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/img2.png) ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/img3.png) ์„ธ cppํŒŒ์ผ๊ณผ ์šฐ์ธก์€ stdafx.hํŒŒ์ผ์˜ include ์ƒํƒœ์ด๋‹ค. ์‹ค์ œ ์ „์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ํŒŒ์ผ ํฌ๊ธฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/img4.png) ๋‚ด๊ฐ€ ์ž‘์„ฑ์„ 30์ค„์„ ํ•˜๋”๋ผ๋„ ์—ฌ๊ธฐ์— includeํ•˜๋Š” ํ—ค๋”ํŒŒ์ผ์ด 2๋งŒ ์ค„ ์ •๋„ ๋˜๋ฉด ์‹ค์ œ๋กœ๋Š” 2๋งŒ 30์ค„์งœ๋ฆฌ CppํŒŒ์ผ์„ ์ปดํŒŒ์ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋œ๋‹ค. ## Compiler ์‹ค์ œ๋กœ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ • ์‹คํ–‰ ์ฝ”๋“œ๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์‹ฌ๋ณผ๋“ค์—๋Œ€ํ•ด์„œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ์€ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋‹ค. ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฌผ์ด ์šฐ๋ฆฌ๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ทธ๋‚˜๋งˆ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ์ค‘ ๊ฐ€์žฅ ๊ธฐ๊ณ„์–ด์— ๊ฐ€๊น๋‹ค. ์ž์„ธํžˆ๋Š” ๋ณดํ†ต ์ปดํŒŒ์ผ๋Ÿฌ ์ˆ˜์—…์—์„œ ๋‹ค๋ฃจ๋Š” ๊ตฌ๋ฌธ ๋ถ„์„์ด ์ฃผ์š” ํ•ต์‹ฌ์œผ๋กœ ์ž‘์šฉํ•œ๋‹ค. ์ด ๋‹ค์Œ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ๋ฌผ์€ ์ด์ง„ ํŒŒ์ผ์ด๋‹ค. ## Assembler ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋ฅผ ์ด์ง„ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ๊ฐ„๋‹จํ•œ ํŒŒ์ผ์€ ์‹คํ–‰ํŒŒ์ผ์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ๊ฒฐ๊ณผ๋ฌผ์„ object ํŒŒ์ผ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹จ์ผ Cpp ํŒŒ์ผ์„ ํ•œ๋ฒˆ์”ฉ ์ปดํŒŒ์ผํ•˜์—ฌ objectํŒŒ์ผ์„ ๋ฝ‘์•„๋‚ด๊ณ  N๊ฐœ์˜ cppํŒŒ์ผ์— ๋Œ€ํ•ด์„œ N๊ฐœ์˜ objectํŒŒ์ผ์„ ๋ฝ‘์•„๋‚ด๊ณ  N๊ฐœ์˜ objectํŒŒ์ผ์„ ๋งํ‚นํ•˜์—ฌ 1๊ฐœ์˜ ์˜จ์ „ํ•œ ์‹คํ–‰ํŒŒ์ผ์„ ๋ฝ‘์•„๋‚ด๋Š” ๊ณผ์ •์ด๋‹ค. ์ž ์—ฌ๊ธฐ๊นŒ์ง€ ์„œ๋ก ์ด ๋๋‚ฌ๋‹ค. # ์ปดํŒŒ์ผ์˜ ๊ฒฐ๊ณผ : Object File object ํŒŒ์ผ์€ ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. 1. reloacatable object file ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ๋ชฉ์ ํŒŒ์ผ ํ•˜์ž๊ฐ€ ์žˆ์–ด์„œ ์‹คํ–‰ํŒŒ์ผ์ด ๋ชป ๋œ ํŒŒ์ผ์ด๋‹ค. a.cpp์„ ์ปดํŒŒ์ผํ–ˆ๋Š”๋ฐ a.cpp ์—์„œ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜ func() ๊ฐ€ b.cpp ํŒŒ์ผ์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ์‹คํ–‰ํŒŒ์ผ์ด ๋  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด๋‹ค. ์ด๋Ÿฐ ๋ชฉ์ ํŒŒ์ผ์„ ๋ชจ์•„์„œ ๋งํ‚น์„ ํ•˜๋ฉด ์‹คํ–‰ ํŒŒ์ผ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค gcc์—์„œ ๋ณดํ†ต .o ํ™•์žฅ์ž์„ ์‚ฌ์šฉํ•˜๊ณ  windows msvc ์—์„œ๋Š” .obj ํŒŒ์ผ ํ™•์žฅ์ž์ด๋‹ค. 2. excuteable object file ์‹คํ–‰ ๊ฐ€๋Šฅ ๋ชฉ์  ํŒŒ์ผ ์‹คํ–‰ ๊ฐ€๋Šฅ ๋ชฉ์  ํŒŒ์ผ์€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ตœ์ข… ๊ฒฐ๊ณผ์ธ ์‹คํ–‰ํŒŒ์ผ์ด๋‹ค. windows์—์„œ๋Š” .exe ํ™•์žฅ์ž, linux์—์„œ๋Š” .out ํ™•์žฅ์ž(๊ผญ ๊ทธ๋ ‡์ง„ ์•Š๋‹ค)์ด๋‹ค. ์‹คํ–‰ ํŒŒ์ผ์„ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์šด์˜์ฒด์ œ์˜ ๋‹ด๋‹น์ธ์ง€๋ผ ํŒŒ์ผ ํ˜•์‹์€ ์šด์˜์ฒด์ œ๊ฐ€ ์ •ํ•œ ํ˜•์‹์— ์ข…์†๋œ๋‹ค. windows์˜ ์‹คํ–‰ ํŒŒ์ผ์€ linux์—์„œ ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. Linking๋‹จ๊ณ„๊นŒ์ง€ ๊ณ ๋ คํ•˜์—ฌ object ํŒŒ์ผ ํฌ๋งท์ด OS์— ์ข…์†๋˜๋Š”๋ฐ linux์—์„œ ๋ชฉ์  ํŒŒ์ผ ํฌ๋งท์€ ELF(Executable and Linkable Format**)** ํฌ๋งท์ด ๋ผํ•˜๊ณ  Windows ์—์„œ๋Š” PE Format(Portable Exceuteable)์ด๋ผ ํ•œ๋‹ค. 3. Shared object file ๊ณต์œ  ๋ชฉ์  ํŒŒ์ผ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ ํ”„๋กœ์ ํŠธ ๋งŽ์ด ์•„๋‹Œ ์™„์ „ ํƒ€์ธ์—๊ฒŒ๋„ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ์œ„ํ•ด์„œ ์ž‘์„ฑํ•œ CppํŒŒ์ผ์„ ๋ชจ๋‘ ๋ฐ›์•„์„œ ์ปดํŒŒ์ผ๊นŒ์ง€ ๋งž์ถฐ์„œ ์„ธํŒ…ํ•˜๋Š”๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์‚ฌ์‹ค์€ ๋ณ€๊ฒฝ๋˜์ง€์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š”๊ฒƒ์กฐ์ฐจ ๋น„ํšจ์œจ์ ์ด๋‹ค. ๋ฌถ์ธ ํŒŒ์ผ์„ ํ•˜๋‚˜๋งŒ ์ „๋‹ฌ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€์•Š์„๊นŒ ํ•˜๋Š” ์•„์ด๋””์–ด์—์„œ ์ถœ๋ฐœ ๋’ค์—์„œ ๋” ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช… # Object File ์ƒ์„ธ ์‹ค์ œ PE File ๊ณต์‹ ๋ฌธ์„œ : <https://learn.microsoft.com/ko-kr/windows/win32/debug/pe-format?redirectedfrom=MSDN> ๋ณธ Windows ์—์„œ ์‹คํ–‰ํŒŒ์ผ์€ ์ด๋ฏธ์ง€/PE(์ด์‹ ๊ฐ€๋Šฅํ•œ ์‹คํ–‰ ํŒŒ์ผ) ํŒŒ์ผ, ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅ ๋ชฉ์ ํŒŒ์ผ์€ ๊ฐœ์ฒด /COFF(๊ณต์šฉ ๊ฐœ์ฒด ํŒŒ์ผ ํ˜•์‹) ํŒŒ์ผ ์ด๋ผ๊ณ ํ•œ๋‹ค. ์ƒ์„ธํ•˜๊ฒŒ๋Š” ๋ช…์นญ ๋“ฑ ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ ์ „์ฒด์ ์ธ ์„น์…˜ ๊ฐœ์š”๋Š” ELF์™€ ๋น„์Šทํ•œ ๊ตฌ์กฐ์ด๋‹ค. ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/Untitled%201.png) ELF ์žฌ๋ฐฐ์น˜ ํŒŒ์ผ ๊ตฌ์กฐ ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/Untitled%202.png) ๊ฐ ๊ตฌ์—ญ ๋ณ„๋กœ Section์ด ๋‚˜๋‰œ๋‹ค. ๋ชฉ์ ํŒŒ์ผ ์ „์ฒด์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋„ค๊ฐ€์ง€ - .bss : ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ „์—ญ๋ณ€์ˆ˜์™€ ์ •์ ๋ณ€์ˆ˜ - .data : ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ๋ณ€์ˆ˜ ๋ฐ ์ •์  ๋ณ€์ˆ˜ - .rdata : ์ดˆ๊ธฐํ™”๋œ ์ฝ๊ธฐ ์ „์šฉ ๋ฐ์ดํ„ฐ (์ŠคํŠธ๋ง), ์Šค์œ„์น˜ ์ผ€์ด์Šค ์ ํ”„ ํ…Œ์ด๋ธ” - .text : ๋ช…๋ น์–ด ๋จธ์‹  ์ฝ”๋“œ ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์—์„œ์˜ ์ต์ˆ™ํ•œ ์š” ๋‚ด์šฉ์— ํ•ด๋‹น ํ•˜๋Š” section์ด๋‹ค. ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/Untitled%203.png) - .debug ์„น์…˜ - **๋””๋ฒ„๊ทธ ๋””๋ ‰ํ„ฐ๋ฆฌ** - **.debug\$F(๊ฐœ์ฒด๋งŒ ํ•ด๋‹น)** - **.debug\$S(๊ฐœ์ฒด๋งŒ ํ•ด๋‹น)** ์ด ์„น์…˜์—๋Š” Visual C++ ๋””๋ฒ„๊ทธ ์ •๋ณด(์‹ฌ๋ณผ ์ •๋ณด)๊ฐ€ ํฌํ•จ - **.debug\$P(๊ฐœ์ฒด๋งŒ ํ•ด๋‹น)** ์ด ์„น์…˜์—๋Š” Visual C++ ๋””๋ฒ„๊ทธ ์ •๋ณด(๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ์ •๋ณด)๊ฐ€ ํฌํ•จ. ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ํ—ค๋”๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผ๋œ ๋ชจ๋“  ๊ฐœ์ฒด ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ํ˜•์‹ - **.debug\$T(๊ฐœ์ฒด๋งŒ ํ•ด๋‹น)** ์ด ์„น์…˜์—๋Š” Visual C++ ๋””๋ฒ„๊ทธ ์ •๋ณด(ํ˜•์‹ ์ •๋ณด)๊ฐ€ ํฌํ•จ ## **Microsoft ๋””๋ฒ„๊ทธ ์ •๋ณด์— ๋Œ€ํ•œ ๋ง์ปค ์ง€์›** ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ง์ปค์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. - **.debug\$F**, **debug\$S**, **.debug\$P** ๋ฐ **.debug\$T** ์„น์…˜์—์„œ ๋ชจ๋“  ๊ด€๋ จ ๋””๋ฒ„๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. - ๋ง์ปค์—์„œ ์ƒ์„ฑํ•œ ๋””๋ฒ„๊น… ์ •๋ณด์™€ ํ•จ๊ป˜ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ PDB ํŒŒ์ผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋””๋ฒ„๊ทธ ๋””๋ ‰ํ„ฐ๋ฆฌ ํ•ญ๋ชฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. - .**edata** : (์ด๋ฏธ์ง€๋งŒ ํ•ด๋‹น) : ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐ์ดํ„ฐ ์„น์…˜. ๋‹ค๋ฅธ ์ด๋ฏธ์ง€์—์„œ ๋™์  ๋งํฌ๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๋ณผ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ - .reloc ์„น์…˜(์ด๋ฏธ์ง€๋งŒ ํ•ด๋‹น) : ์ด๋ฏธ์ง€์˜ ๋ชจ๋“  ๋ฒ ์ด์Šค ์žฌ๋ฐฐ์น˜์— ๋Œ€ํ•œ ํ•ญ๋ชฉ์ด ํฌํ•จ - **.drectve**(๊ฐœ์ฒด๋งŒ ํ•ด๋‹น) **:** IMAGE\_SCN\_LNK\_INFO ์„ธํŒ…๋˜์–ด์žˆ์–ด์•ผํ•จ *\*\**๋ง์ปค ์˜ต์…˜ - **.idata** ์„น์…˜ : ์‹ฌ๋ณผ ๊ฐ€์ ธ์˜ค๊ธฐ ์ •๋ณด - .pdata ์„น์…˜ : ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜ ํ…Œ์ด๋ธ” ํ•ญ๋ชฉ์˜ ๋ฐฐ์—ด - .tls ์„น์…˜ : ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ํ…Œ์ด๋ธ” ์ฃผ์†Œ ๋ฐ ํฌ๊ธฐ - .rsrc ์„น์…˜ : ๋ฆฌ์†Œ์Šค ๋ฐ์ดํ„ฐ (GUI ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ์„น์…˜, ๊ทธ๋ž˜ํ”ฝ ์ •๋ณด ์ €์žฅ) - .sxdata ์„น์…˜ - .cormeta ์„น์…˜(๊ฐœ์ฒด๋งŒ ํ•ด๋‹น) ๋˜ํ•œ ๊ฐœ์ฒด ํŒŒ์ผ์€ ๊ฐ ์„น์…˜๋งˆ๋‹ค **COFF ์žฌ๋ฐฐ์น˜(๊ฐœ์ฒด๋งŒ ํ•ด๋‹น)**์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ฃผ์†Œ ์ง€์ •์ด ํ•„์š”ํ•œ ์‹ฌ๋ณผ์„๋‚˜์ค‘์— ํ•ด๋‹น ์‹ฌ๋ณผ์˜ ์ฃผ์†Œ๋ฅผ ์จ๋„ฃ๊ธฐ ์œ„ํ•œ ์ฃผ์†Œ๋ฅผ ๊ธฐ์ž…ํ•˜๊ธฐ ์œ„ํ•œ offset์„ ๊ธฐ๋กํ•˜๋Š” ํ…Œ์ด๋ธ”์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ์ผ ๋งˆ์ง€๋ง‰์— COFF ์‹ฌ๋ณผ ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•œ๋‹ค # Linker ์—ฌ๋Ÿฌ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋กœ ํ•ฉ์ณ๋ฒ„๋ฆฐ๋‹ค. ๋ง์ปค๋Š” ๋‘๋‹จ๊ณ„๋กœ ์ง„ํ–‰๋œ๋‹ค. 1. Symbol resolution ์‹ฌ๋ณผ ํ•ด์„ ๊ฐ ์žฌ๋ฐฐ์น˜ ๋ชฉ์ ํŒŒ์ผ์˜ ์‹ฌ๋ณผํ…Œ์ด๋ธ”์„ ํ•ฉ์ณ์„œ ์™„์ „ํ•œ ํ•˜๋‚˜์˜ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ” ์—”ํŠธ๋ฆฌ๋ฅผ ๊ฐ€์ง„๋‹ค. 2. Relocation ์žฌ๋ฐฐ์น˜ : ์•ž๋‹จ๊ณ„์˜ ์‹ฌ๋ณผ ํ…Œ์ด๋ธ” ์—”ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ์‹ค์ œ๋กœ ์‹ฌ๋ณผ์— ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•œ๋‹ค. 1. ์„น์…˜๊ณผ ์‹ฌ๋ณผ ์ •์˜๋ฅผ ์žฌ๋ฐฐ์น˜ : ๊ฐ ํŒŒ์ผ๋งˆ๋‹ค ๊ฒน์น˜๋Š” ์„น์…˜์„ ํ•˜๋‚˜์˜ ๋‹จ์ผํ™”๋œ ์„น์…˜์œผ๋กœ ํ•ฉ์นœ๋‹ค. 2. ์„น์…˜ ๋‚ด ์‹ฌ๋ณผ ์ฐธ์กฐ๋ฅผ ์žฌ๋ฐฐ์น˜ : ๋ชจ๋“  ์‹ฌ๋ณผ ์ฐธ์กฐ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ •ํ™•ํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋„๋ก ์ž‘์—… ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋‹ค. - PC ์ƒ๋Œ€ ์ฐธ์กฐ์˜ ์žฌ๋ฐฐ์น˜ : PC (Program Counter)์„ ๊ธฐ์ค€์œผ๋กœ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹ - ์ ˆ๋Œ€ ์ฐธ์กฐ์˜ ์žฌ๋ฐฐ์น˜ : ์ ˆ๋Œ€์ ์ธ ๋ณ€์ˆ˜, ํ•จ์ˆ˜์˜ ์ฃผ์†Ÿ๊ฐ’์„ ์ง์ ‘ ๋ฐ•์•„ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹ # Symbol resolution ์‹œ ์ค‘๋ณต ์ •์˜๋œ ์‹ฌ๋ณผ ์ฒ˜๋ฆฌ ์ด ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ๊ฐ•ํ•œ์‹ฌ๋ณผ๊ณผ ์•ฝํ•œ ์‹ฌ๋ณผ์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋“ฑ์žฅํ•œ๋‹ค. 1. strong symbol ๊ฐ•ํ•œ ์‹ฌ๋ณผ : ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ๋ณ€์ˆ˜ 2. weak symbol ์•ฝํ•œ ์‹ฌ๋ณผ : ์ดˆ๊ธฐํ™”๋˜์ง€์•Š์€ ์ „์—ญ๋ณ€์ˆ˜ ๊ทœ์น™ 1. ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ–๋Š” ๋ณต์ˆ˜์˜ ๊ฐ•ํ•œ ์‹ฌ๋ณผ์€ ํ—ˆ์šฉํ•˜์ง€์•Š๋Š”๋‹ค. (์ค‘๋ณตํ•œ strong symbol์€ ์—๋Ÿฌ) 2. ๋™์ผํ•œ ์ด๋ฆ„์˜ ๊ฐ•ํ•œ ์‹ฌ๋ณผ๊ณผ ๋‹ค์ˆ˜์˜ ์•ฝํ•œ ์‹ฌ๋ณผ๋“ค์€ ๊ฐ•ํ•œ ์‹ฌ๋ณผ์„ ํƒํ•œ๋‹ค (strong symbol \> weak symbol) 3. ๋™์ผํ•œ ์ด๋ฆ„์˜ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์‹ฌ๋ณผ์€ ์–ด๋–ค ์•ฝํ•œ ์‹ฌ๋ณผ์„ ํƒํ•ด๋„ ์ƒ๊ด€์—†๋‹ค. (weak symbol ์ค‘์—์„  ์ง€ ๋ง˜) ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์ดˆ๊ธฐํ™” ํ•˜์ง€์•Š์€ ๊ฐ™์€ ์ด๋ฆ„์˜ ์ „์—ญ๋ณ€์ˆ˜๊ฐ€ ๊ฐ๊ฐ ์žˆ๋‹ค๋˜๊ฐ€ ํƒ€์ž…์ด ๋‹ค๋ฅธ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ด๋ฆ„์ด ๊ฐ™๋‹ค๋˜๊ฐ€ ๋“ฑ์˜ ์ƒํ™ฉ์€ ์˜๋„ํ•˜์ง€์•Š์€ ๋ฒ„๊ทธ๋ฅผ ์™•์ฐฝ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ „์—ญ๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ตœ๋Œ€ํ•œ static ์„ ๋‹ฌ๊ณ  ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค. ์™ธ๋ถ€์—์„œ ๊ฐ€์ ธ๊ฐ€์„œ ์‚ฌ์šฉ์‹œ์—๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜ ๋ ˆํผ๋Ÿฐ์Šค(or ํฌ์ธํ„ฐ)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Getter ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ˜ธ์ถœํ•˜๋Š”๊ฒƒ์ด ์ •์‹ ๊ฑด๊ฐ•์— ์ด๋กญ๋‹ค. # Shared object file ๊ณต์œ  ๋ชฉ์  ํŒŒ์ผ : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ # Static lib ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ์ปดํŒŒ์ผ๋œ ๋ชฉ์ ํŒŒ์ผ ์ง‘ํ•ฉ๋งŒ ํ•„์š”ํ•˜๋ฉด ๋œ๋‹ค. ํ•„๋“œ๋œ ํŒŒ์ผ ๋˜ํ•œ ์—ฌ๋Ÿฌ๊ฐœ๋ฉด ๋ฒˆ๊ฑฐ๋กœ์šฐ๋‹ˆ ํ†ตํ•ฉ๋œ ํ•œ๊ฐœ์˜ ํŒŒ์ผ๋งŒ ์žˆ์ž๋ผ๊ณ  ์ƒ๊ฐํ•œ๊ฒŒ ๋ฐ”๋กœ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. ์ตœ์ดˆ์˜ ์ปดํŒŒ์ผ ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ๋งŒ ๊ฐ€์ง€๊ณ , ๋งํ‚น์‹œ์— ํ•ฉ์น˜๊ธฐํ•ด์„œ ์ตœ์ข… ์‹คํ–‰ํŒŒ์ผ์— ์‹คํ–‰ํŒŒ์ผ์— ๋ชจ๋“ ๊ฒƒ์ด ๋‹ค ๋“ค์–ด๊ฐ€์žˆ๋‹ค. (์‹คํ–‰ํŒŒ์ผ ์šฉ๋Ÿ‰๋„ ๊ทธ๋งŒํผ ์ฆ๊ฐ€) ๊ทธ๋ž˜์„œ ๋‚ด์šฉ๋ฌผ์„ ๋ฌถ์–ด ํ•˜๋‚˜์˜ object file๋งŒ๋“ค๊ณ , ํ—ค๋”ํŒŒ์ผ์„ ์ œ๊ณต โ†’ ์‚ฌ์šฉ์ž๋Š” ํ—ค๋” ํŒŒ์ผ์„ includeํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ง์ปค ๋‹จ๊ณ„์—์„œ ๋ฌถ์Œ object file์„ ํ†ตํ•ด ์‹คํ–‰ํŒŒ์ผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” .a ์œˆ๋„์šฐ์ฆˆ์—์„œ๋Š” .lib ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. # Dynamic Link Lib ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ([Widows DLL ref](https://learn.microsoft.com/en-us/windows/win32/dlls/dynamic-link-libraries) ) static lib๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ ๋ณด๋ฉด ๊ตฐ๋”๋”๊ธฐ ์—†์ด ๊น”๋”ํ•œ ๋ฐฉ์‹์ด๋‹ค. ํ•˜์ง€๋งŒ, ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ์„ ์ •๋ง ๋งŽ์€ ์‹คํ–‰ ํŒŒ์ผ์—์„œ ๋™์‹œ์— ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ์‹คํ–‰ํŒŒ์ผ์— ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งํ‚นํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜๋„์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ จ๋œ ๊ฒƒ์ด ๊ฐœ๋ณ„ ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ ๋  ๊ฒƒ์ด๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ „์ฒด์˜ ์ž…์žฅ์—์„œ๋ณด๋ฉด ๋™์ผํ•œ ์ฝ”๋“œ ๋กœ์ง์ด ํ”„๋กœ์„ธ์Šค ๋ณ„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ชจ๋‘ ์˜ฌ๋ผ๊ฐ€ ์žˆ๋Š” ์…ˆ์ด๋‹ค. ์ถ”๊ฐ€๋กœ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ์‹คํ–‰ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ปค์ง„๋‹ค. ์ด๊ฒŒ ๋น„ํšจ์œจ์ ์ด๋ผ ํŒ๋‹จํ•˜์—ฌ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ํ•œ๋ฒˆ๋งŒ ์ ์žฌํ•˜๊ณ  ์—ฌ๋Ÿฌ ์‹คํ–‰ํŒŒ์ผ์—์„œ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐ๋งŒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์กฐ๋ฅผ ์žก์•˜๋‹ค. ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” .so ํŒŒ์ผ ํ™•์žฅ์ž๋กœ ์œˆ๋„์šฐ์ฆˆ์—์„œ ํ”ํžˆ๋งํ•˜๋Š” DLL ํ™•์žฅ์ž ํŒŒ์ผ์ด ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•œ๋‹ค. ์ž‘๋™๋ฐฉ์‹์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค. 1. **implicit load-time linking :** Loader๊ฐ€ ํ”„๋กœ์„ธ์Šค์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์žฌํ•˜๋Š” ๋•Œ์— DLL๋„ ๊ฐ™์ด ์ ์žฌ๋ฅผ ํ•œ๋‹ค. ์ด๋•Œ ์ด ์ž‘์—…์„ ํ•˜๋Š” ์ฃผ์ฒด๋ฅผ Dynamic linker๋ผ ํ•œ๋‹ค. ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/Untitled%204.png) DLL ์„ ์ฒ˜์Œ์— ์ƒ์„ฑ์‹œ์— ๋‘๊ฐ€์ง€ ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด์ง„๋‹ค dll, lib ํŒŒ์ผ - dll์ด ์‹ค์ œ ๋Œ€๋ถ€๋ถ„์˜ mainํ•จ์ˆ˜์—†๋Š” ํŒŒ์ผ์ด๊ณ , ์‹ค์ œ ๋กœ๋”ฉ์‹œ์— ์‚ฌ์šฉ (dll ํŒŒ์ผ์ด ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋Š” **.edata ์„น์…˜์— ์กด์žฌํ•œ๋‹ค**) - lib ํŒŒ์ผ์€ ๋งํ‚น์‹œ์— ์‚ฌ์šฉ ์ฐธ์กฐ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ•  ๋งํ‚น์‹œ์— ์‚ฌ์šฉ ํ•จ์ˆ˜์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋‹น์—ฐํžˆ ๋งํ‚น์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋•Œ .lib ํŒŒ์ผ์ด ๋งํ‚น์‹œ์— ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๊ตฌํ˜„์ฒด๊ฐ€ DLL์— ์žˆ์Œ์„ ์ธ์ง€ํ•œ๋‹ค. (์ด์— ๋Œ€ํ•œ ์ •๋ณด๋Š” .**idata ์„น์…˜์— ์กด์žฌํ•œ๋‹ค**) ๊ทธ๋Ÿฌ๊ณ  ํŒŒ์ผ ์‹คํ–‰์‹œ์— ๋กœ๋”๊ฐ€ ํ•ด๋‹น DLLํŒŒ์ผ์„ ์‹ค์ œ๋กœ ๋กœ๋“œํ•˜๋ฉด์„œ ํ•จ์ˆ˜์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ฒŒํ•œ๋‹ค. ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/Untitled%205.png) ์‹คํ–‰ํ•˜์ž๋งˆ์ž dll ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋œฐ๊ฑฐ๋‹ค. 1. **explicit run-time linking :** ์†Œ์ŠคํŒŒ์ผ์—์„œ ์ง์ ‘ DLL open(dlopen, LoadLibrary) ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ DLL์„ ๋กœ๋”ฉํ•˜๋Š” ๊ฒฝ์šฐ ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/Untitled%206.png) ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ•˜์—ฌ DLL์„ ์ž‘์„ฑ ์ฝ”๋“œ ๋กœ์ง์ƒ ์ง์ ‘ ๋กœ๋“œ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋กœ๋“œํ•œ DLL์—์„œ ํŠน์ • ํ•จ์ˆ˜๋ช…์— ๋”ฐ๋ฅธ ์ง์ ‘ ํ•จ์ˆ˜ ์ฃผ์†Œ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ํ•จ์ˆ˜ํฌ์ธํ„ฐ๋กœ ์ €์žฅํ•˜๊ณ  ์ด ํ•จ์ˆ˜ํฌ์ธํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ„์ ‘์‚ฌ์šฉํ•œ๋‹ค. ๋‹น์—ฐํžˆ ์ปดํŒŒ์ผ๋‹จ์—์„œ๋Š” ์–ด๋–ค DLL์„ ๋กœ๋“œํ•˜๋Š”์ง€, ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ• ์ง€ **์ปดํŒŒ์ผํƒ€์ž„์— ํŒŒ์•…์ด ๋ถˆ๊ฐ€๋Šฅ**ํ•˜์—ฌ ์‹คํ–‰ํŒŒ์ผ์€ ๋ณธ์ธ์ด DLL์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์กฐ์ฐจ ์•Œ ์ˆ˜ ์—†๋‹ค. ## ๋ชจ๋“ˆ ์ตœ์‹  ์–ธ์–ด๋“ค์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• include๋”ฐ์œ„๋Š” ์ •๋ง ์˜›๋‚  ์–ธ์–ด์—๋‚˜ ํ•ด๋‹น ๊ธฐ๋Šฅ์ด๋‹ค. ์ตœ์‹  ์–ธ์–ด์—๋Š” ๋ชจ๋“ˆ ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋‹ค. include๋Š” ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ **ํ—ค๋”ํŒŒ์ผ ์ „์ฒด**๋ฅผ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐํ•œ๋‹ค. cpp ๊ฐœ๋ณ„ ํŒŒ์ผ ๊ธฐ์ค€์œผ๋กœ ๋ณด๋ฉด ๋ชจ๋“  ํ—ค๋” ํŒŒ์ผ์— ์žˆ๋Š” ๋ชจ๋“  ์ •๋ณด๊ฐ€ ํ•„์š”ํ•  ์ผ์€ ๋ณดํ†ต ์—†๋‹ค. ์š” ํ—ค๋” ํŒŒ์ผ์กฐ์ฐจ ์ชผ๊ฐœ์„œ ํŠน์ • ํ•จ์ˆ˜ ํ•˜๋‚˜๋งŒ ๊ฐ€์ ธ๋‹ค ์“ฐ์ž๋ผ๋Š” ๋ฐฉ์•ˆ์—์„œ ์ƒ๊ฒจ๋‚ฌ๋‹ค. # Windows FE ํฌ๋งท ์‹ค์ œ ๋ถ„์„ ์ž ์ง์ ‘ ํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณด์ž ``` ``` func1 ํŒŒ์ผ์ด ์—†์–ด์„œ **๋‹น์—ฐํžˆ ๋ง์ปค์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ**ํ•œ๋‹ค. ๊ทธ๋Ÿผ objํŒŒ์ผ์€ ์ƒ์„ฑ ๋˜์–ด์žˆ์œผ๋‹ˆ ์š” obj ํŒŒ์ผ์„ ํ•œ๋ฒˆ PEView ๋กœ ์—ด์–ด๋ณด์ž ๋ช…์‹ฌํ•˜์ž ํŒŒ์ผ์€ ๊ฒฐ๊ตญ ๊ทธ๋ƒฅ ์ด์ง„์ˆ˜ ๋ฉ์–ด๋ฆฌ๋‹ค. PEView๋„ ๊ฒฐ๊ตญ์— ์ด์ง„ ๋ช…๋ น์–ด๋ฅผ ๋ถ„์„ํ•ด๋ดค์œผ๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ์ด์ง„ ๋ฉ์–ด๋ฆฌ๋ฅผ ๊ทœ์น™์—๋”ฐ๋ผ ๊ทธ๋ƒฅ ๋ช‡๋ฐ”์ดํŠธ ์”ฉ์ฝ๊ณ  ํ•ด์„ ํ•ด๋†“์€ ๊ฒƒ์— ๋ถˆ๊ณผํ•˜๋‹ค. ๊ทœ์น™๋งŒ ์žˆ์œผ๋ฉด ์šฐ๋ฆฌ๋„ PEView๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค **drectve :** ๋ง์ปค์˜ต์…˜์ด ๋“ค์–ด์žˆ๋‹ค ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/Untitled%207.png) - debug\$S ์‹ฌ๋ณผ ์ •๋ณด ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/Untitled%208.png) - data : ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ๋ณ€์ˆ˜ ๋ฐ ์ •์  ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋“ค์–ด์žˆ๋‹ค. global ๋ฐ staticVAr ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/Untitled%209.png) - rdata ์ดˆ๊ธฐํ™”๋œ ์ฝ๊ธฐ ์ „์šฉ ๋ฐ์ดํ„ฐ (์ŠคํŠธ๋ง) ![Untitled](https://eeeuns.github.io/images/understandingcomputerCompileO/Untitled%2010.png) ์ž ์ด์ œ ์–ด์…ˆ์„ ๊นŒ๋ณด์ž ์–ด์…ˆ์€ PE View์—์„œ ๋ชป๋ณด๋Š” ๋“ฏํ•ด์„œ ๋‹ค๋ฅธ ํˆด์„ ์ฐพ์•„๋ดค์„๋•Œ ๊ณต์‹์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ์ค‘์—๋Š” Visual Studio msvc ๋‚ด์žฅ ํˆด์ธ [dumpbin.exe](https://learn.microsoft.com/en-us/cpp/build/reference/dumpbin-reference?view=msvc-170) ์œผ๋กœ ์ง์ ‘ ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ํˆด์ธ ๋งŒํผ ๊ฐ€์žฅ ์ •ํ™•ํ•˜๊ณ  ํ™•์‹คํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. visual studio ์„ค์น˜ ํด๋”์•ˆ์—์„œ ํ•ด๋‹น ํŒŒ์ผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋‚˜์˜จ๋‹ค. ์ด ํˆด์„ ํ†ตํ•ด์„œ obj text section์„ Disasmํ•œ ๊ฒฐ๊ณผ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค ``` ``` ``` ``` ``` ``` ์–ด์…ˆ์ƒ์— ์‹ค์ œ๋กœ ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ•œ ๊ณณ์€ ๋ชจ๋‘ 0์œผ๋กœ ๋ฐ€๋ ค์žˆ๋‹ค. ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ disasemble๋กœ ๋ณ€์ˆ˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ง‘์–ด๋ƒˆ์„๊นŒ? ํ•ด๋‹น ์ •๋ณด๋“ค์€ ๊ฐœ๋ณ„๋กœ **COFF ์žฌ๋ฐฐ์น˜** ํ…Œ์ด๋ธ”์— ์กด์žฌํ•œ๋‹ค. ``` ``` ์ตœ์ข…์ ์ธ ์ „์ฒด ํ•ด๋‹น OBJ์˜ COFF SYMBOL TABLE ์ด๋‹ค ``` ``` ์ค‘๊ฐ„์˜ Static, External, Label ๋Š” ์„ค๋ช…์ด ์—†์–ด๋„ ๊ฐ๊ฐ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์„๊ฑฐ๋ผ ์ƒ๊ฐํ•œ๋‹ค ๋งํฌ์—๋Ÿฌ๋ฅผ ๋ฑ‰์€ func1 ์„ ์ง€์šฐ๊ณ  ์ปดํŒŒ์ผ์„ ํ–ˆ์„๋•Œ ์ตœ์ข… ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ์˜ main ํ•จ์ˆ˜ disasm ์ด๋‹ค ``` ``` ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋“ค์˜ ์ฃผ์†Œ๋ฅผ ์ ˆ๋Œ€ ์ฐธ์กฐํ•˜์—ฌ ์žฌ๋ฐฐ์น˜ํ•˜์˜€๋‹ค. notepad์˜ import ํŒŒ์ผ์„ ํ•œ๋ฒˆ ๋ณด์ž. ``` ``` ๋Œ€์ถฉ ์ด๋Ÿฐ๋А๋‚Œ์ด๋‹ค. - csapp 7์žฅ ๋ง์ปค - [\[CS:APP 13-1\] Linking 1 - ์–ด๋–ป๊ฒŒ ๋งํ‚น ์—๋Ÿฌ๋ฅผ ํ”ผํ• ๊นŒ](https://blog.kurcreative.com/kur1701091416) - [\[CS:APP 13-2\] Linking 2 - ์ •์  ๋งํ‚นlib๊ณผ ๋™์  ๋งํ‚นdll](https://blog.kurcreative.com/kur1701091636) Posted 2024-08-09 [etc](https://eeeuns.github.io/tags/#etc) Please enable JavaScript to view the [comments powered by Disqus.](https://disqus.com/?ref_noscript)
Readable Markdownnull
Shard143 (laksa)
Root Hash2566890010099092343
Unparsed URLio,github!eeeuns,/2024/08/09/understandingcomputercompileo/ s443