<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>http://junhoahn.kr/noriwiki/index.php?action=history&amp;feed=atom&amp;title=Executable_and_linkage_format</id>
	<title>Executable and linkage format - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="http://junhoahn.kr/noriwiki/index.php?action=history&amp;feed=atom&amp;title=Executable_and_linkage_format"/>
	<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Executable_and_linkage_format&amp;action=history"/>
	<updated>2026-05-19T11:19:51Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://junhoahn.kr/noriwiki/index.php?title=Executable_and_linkage_format&amp;diff=458&amp;oldid=prev</id>
		<title>Ahn9807: 새 문서: 분류: 파일 포맷 분류: 프로그램 실행  == 개요 == ELF (Executable and Linkable Fromat)이란 유닉스 시스템에서 사용하기 위해서 발명된 Executable Format이다. ELF 포맷은 프로그램의 실행을 크게 TEXT, DATA, BSS섹션으로 나눈다. 현재 ELF포맷은 유닉스시스템에서 표준으로 사용되며 많은 영향을 미치고 있다.   == 구조 == ELF는 프로그램의 부분을 담고 있는 포맷이다. ELF는 여...</title>
		<link rel="alternate" type="text/html" href="http://junhoahn.kr/noriwiki/index.php?title=Executable_and_linkage_format&amp;diff=458&amp;oldid=prev"/>
		<updated>2023-02-11T02:21:22Z</updated>

		<summary type="html">&lt;p&gt;새 문서: &lt;a href=&quot;/noriwiki/index.php?title=%EB%B6%84%EB%A5%98:%ED%8C%8C%EC%9D%BC_%ED%8F%AC%EB%A7%B7&quot; title=&quot;분류:파일 포맷&quot;&gt;분류: 파일 포맷&lt;/a&gt; &lt;a href=&quot;/noriwiki/index.php?title=%EB%B6%84%EB%A5%98:%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8_%EC%8B%A4%ED%96%89&quot; title=&quot;분류:프로그램 실행&quot;&gt;분류: 프로그램 실행&lt;/a&gt;  == 개요 == ELF (Executable and Linkable Fromat)이란 유닉스 시스템에서 사용하기 위해서 발명된 Executable Format이다. ELF 포맷은 프로그램의 실행을 크게 TEXT, DATA, BSS섹션으로 나눈다. 현재 ELF포맷은 &lt;a href=&quot;/noriwiki/index.php?title=%EC%9C%A0%EB%8B%89%EC%8A%A4&quot; title=&quot;유닉스&quot;&gt;유닉스&lt;/a&gt;시스템에서 표준으로 사용되며 많은 영향을 미치고 있다.   == 구조 == ELF는 프로그램의 부분을 담고 있는 포맷이다. ELF는 여...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[분류: 파일 포맷]]&lt;br /&gt;
[[분류: 프로그램 실행]]&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
ELF (Executable and Linkable Fromat)이란 유닉스 시스템에서 사용하기 위해서 발명된 Executable Format이다. ELF 포맷은 프로그램의 실행을 크게 TEXT, DATA, BSS섹션으로 나눈다. 현재 ELF포맷은 [[유닉스]]시스템에서 표준으로 사용되며 많은 영향을 미치고 있다. &lt;br /&gt;
&lt;br /&gt;
== 구조 ==&lt;br /&gt;
ELF는 프로그램의 부분을 담고 있는 포맷이다. ELF는 여러 섹션으로 나누어지는데, 이 섹션은 헤더에 의해서 어떻게 메모리에 적제될지 결정하게 된다. 이러한 헤더에는 링킹단계에서 symbol 테이블에 의해서 결정된다.&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
|-&lt;br /&gt;
| .text&lt;br /&gt;
| 코드 영역이 작성되는 부분이다. objdump -drS .process.o will show you that&lt;br /&gt;
|-&lt;br /&gt;
| .data&lt;br /&gt;
| global tables, variables, etc. 들이 적재되는 공간이다. objdump -s -j .data .process.o will hexdump it.&lt;br /&gt;
|-&lt;br /&gt;
| .bss&lt;br /&gt;
| 0으로 초기화 되는 변수들이 저장되는 공간이다. 0으로 초기화 되는 변수들은 여기에 위치함으로써 링커가 로딩과정에서 자동으로 0으로 채우게 된다.&lt;br /&gt;
|-&lt;br /&gt;
| .rodata&lt;br /&gt;
| 문자열이 저장되는 공간이다. ReadOnly data의 약자이며, 문자열과 같은 const데이터들은 여기에 저장된다. (! 만약 const를 초기화 하지 않으면 이 또한 bss섹션으로 저장된다.)&lt;br /&gt;
|-&lt;br /&gt;
| .comment &amp;amp; .note&lt;br /&gt;
| 컴파일러나 링커가 작성한 커맨트 들이 들어간다.&lt;br /&gt;
|-&lt;br /&gt;
| .stab &amp;amp; .stabstr&lt;br /&gt;
| 디버깅 심볼과 디버깅 관련 정보가 들어간다.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
컴파일러와 링커는 이 정보를 해석하여 ELF파일 헤더로 변환하여 저장하게 된다. 각각의 ELF파일 헤더는 위치하는 섹션에대한 offset과 size등과 같은 메모리 로드에 필요한 정보를 포함하여, ELF파일의 어떤 위치에 어떤 정보가 저장되어 있는지 나타내게 된다.&lt;br /&gt;
&lt;br /&gt;
ELF 파일 헤더는 [[32비트]] 또는 [[64비트]] 주소들이 사용되어야 하는지를 정의한다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ ELF 헤더&lt;br /&gt;
&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; |오프셋&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; |크기(Bytes)&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; |필드&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; |목적&lt;br /&gt;
|-&lt;br /&gt;
! 32-bit&lt;br /&gt;
! 64-bit&lt;br /&gt;
! 32-bit&lt;br /&gt;
! 64-bit&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 0x00&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 4&lt;br /&gt;
| &amp;lt;code&amp;gt;e_ident[EI_MAG0]&amp;lt;/code&amp;gt; 부터 &amp;lt;code&amp;gt;e_ident[EI_MAG3]&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x7F&amp;lt;/code&amp;gt;와 [[미국정보교환표준부호|ASCII]] 코드 &amp;lt;code&amp;gt;ELF&amp;lt;/code&amp;gt;; 이 네 바이트가 매직 넘버를 형성한다.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 0x04&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 1&lt;br /&gt;
| &amp;lt;code&amp;gt;e_ident[EI_CLASS]&amp;lt;/code&amp;gt;&lt;br /&gt;
|이 바이트는 &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; 또는 &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;로 설정되며 32비트 또는 64비트 형식을 나타낸다.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 0x05&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 1&lt;br /&gt;
| &amp;lt;code&amp;gt;e_ident[EI_DATA]&amp;lt;/code&amp;gt;&lt;br /&gt;
|이 바이트는 &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; 또는 &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;로 설정되며 리틀 또는 빅[[엔디언]]을 나타낸다.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 0x06&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 1&lt;br /&gt;
| &amp;lt;code&amp;gt;e_ident[EI_VERSION]&amp;lt;/code&amp;gt;&lt;br /&gt;
|오리지널 버전의 ELF인 경우 &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;로 설정된다.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 0x07&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 1&lt;br /&gt;
| &amp;lt;code&amp;gt;e_ident[EI_OSABI]&amp;lt;/code&amp;gt;&lt;br /&gt;
|대상 운영 체제 [[응용 프로그램 이진 인터페이스|ABI]]를 구별한다..&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-bottom: 10px;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!값&lt;br /&gt;
!ABI&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|[[유닉스 시스템 V|System V]]&lt;br /&gt;
|-&lt;br /&gt;
|0x01&lt;br /&gt;
|[[HP-UX]]&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|[[NetBSD]]&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|[[리눅스]]&lt;br /&gt;
|-&lt;br /&gt;
|0x06&lt;br /&gt;
|[[솔라리스 (운영 체제)|솔라리스]]&lt;br /&gt;
|-&lt;br /&gt;
|0x07&lt;br /&gt;
|[[AIX (운영 체제)|AIX]]&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|[[IRIX]]&lt;br /&gt;
|-&lt;br /&gt;
|0x09&lt;br /&gt;
|[[FreeBSD]]&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|[[OpenBSD]]&lt;br /&gt;
|-&lt;br /&gt;
|0x0D&lt;br /&gt;
|[[OpenVMS]]&lt;br /&gt;
|}&lt;br /&gt;
이것은 대상 플랫폼과 관련 없이 종종 &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;으로 설정된다.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 0x08&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 1&lt;br /&gt;
| &amp;lt;code&amp;gt;e_ident[EI_ABIVERSION]&amp;lt;/code&amp;gt;&lt;br /&gt;
|ABI 버전을 더 명시한다. 이 해석은 대상 ABO에 따라 달라진다. 2.6 버전 이후의 리눅스 커널은 이것을 정의하지 않는다. 이 경우 오프셋과 크기는 &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;이다.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 0x09&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 7&lt;br /&gt;
| &amp;lt;code&amp;gt;e_ident[EI_PAD]&amp;lt;/code&amp;gt;&lt;br /&gt;
|현재 사용하지 않음&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 0x10&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 2&lt;br /&gt;
| &amp;lt;code&amp;gt;e_type&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;는 각각 재배치, 실행, 공유 그리고 코어를 명시한다.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 0x12&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 2&lt;br /&gt;
| &amp;lt;code&amp;gt;e_machine&amp;lt;/code&amp;gt;&lt;br /&gt;
|대상 [[명령어 집합]]을 명시한다. 예를 들면:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-bottom: 10px;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!값&lt;br /&gt;
!ISA&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
| 특정한 명령어 집합 없음&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|[[SPARC]]&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|[[x86]]&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|[[MIPS 아키텍처|MIPS]]&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|[[파워PC]]&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|ARM&lt;br /&gt;
|-&lt;br /&gt;
|0x2A&lt;br /&gt;
|[[슈퍼H]]&lt;br /&gt;
|-&lt;br /&gt;
|0x32&lt;br /&gt;
|IA-64&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|[[x86-64]]&lt;br /&gt;
|-&lt;br /&gt;
|0xB7&lt;br /&gt;
|[[ARM 아키텍처|AArch64]]&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 0x14&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 4&lt;br /&gt;
| &amp;lt;code&amp;gt;e_version&amp;lt;/code&amp;gt;&lt;br /&gt;
|오리지날 버전의 ELF인 경우 &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;로 설정된다.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| 8&lt;br /&gt;
| &amp;lt;code&amp;gt;e_entry&amp;lt;/code&amp;gt;&lt;br /&gt;
|이것은 [[엔트리 포인트]]의 메모리 주소이다. 즉 프로세스가 어디서 실행을 시작하는지를 말해준다. 이 필드는 위에서 정의한 32비트 또는 64비트에 따라 길이가 다르다.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| 8&lt;br /&gt;
| &amp;lt;code&amp;gt;e_phoff&amp;lt;/code&amp;gt;&lt;br /&gt;
|프로그램 헤더 테이블의 시작을 가리킨다.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| 8&lt;br /&gt;
| &amp;lt;code&amp;gt;e_shoff&amp;lt;/code&amp;gt;&lt;br /&gt;
|섹션 헤더 테이블의 시작을 가리킨다.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x30&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 4&lt;br /&gt;
| &amp;lt;code&amp;gt;e_flags&amp;lt;/code&amp;gt;&lt;br /&gt;
|대상 아키텍처에 따라 이 필드의 해석이 달라진다.&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x34&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 2&lt;br /&gt;
| &amp;lt;code&amp;gt;e_ehsize&amp;lt;/code&amp;gt;&lt;br /&gt;
|이 헤더의 크기를 가지며 일반적으로 64비트의 경우 64바이트, 32비트의 경우 52바이트이다.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 0x36&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 2&lt;br /&gt;
| &amp;lt;code&amp;gt;e_phentsize&amp;lt;/code&amp;gt;&lt;br /&gt;
|프로그램 헤더 테이블 엔트리의 크기를 갖는다.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 0x38&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 2&lt;br /&gt;
| &amp;lt;code&amp;gt;e_phnum&amp;lt;/code&amp;gt;&lt;br /&gt;
|프로그램 헤더 테이블에서 엔트리의 개수.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 0x3A&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 2&lt;br /&gt;
| &amp;lt;code&amp;gt;e_shentsize&amp;lt;/code&amp;gt;&lt;br /&gt;
|섹션 헤더 테이블 엔트리의 크기를 갖는다.&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x3C&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 2&lt;br /&gt;
| &amp;lt;code&amp;gt;e_shnum&amp;lt;/code&amp;gt;&lt;br /&gt;
|섹션 헤더 테이블에서 엔트리의 개수.&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 0x3E&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | 2&lt;br /&gt;
| &amp;lt;code&amp;gt;e_shstrndx&amp;lt;/code&amp;gt;&lt;br /&gt;
|섹션 이름들을 포함하는 섹션 헤더 테이블 엔트리의 인덱스.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
64 bit version의 Executable Header.&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
|-&lt;br /&gt;
| Position&lt;br /&gt;
| Value&lt;br /&gt;
|-&lt;br /&gt;
| 0-3&lt;br /&gt;
| Type of segment (see below)&lt;br /&gt;
|-&lt;br /&gt;
| 4-7&lt;br /&gt;
| Flags (see below)&lt;br /&gt;
|-&lt;br /&gt;
| 8-15&lt;br /&gt;
| The offset in the file that the data for this segment can be found (p_offset)&lt;br /&gt;
|-&lt;br /&gt;
| 16-23&lt;br /&gt;
| Where you should start to put this segment in virtual memory (p_vaddr)&lt;br /&gt;
|-&lt;br /&gt;
| 24-31&lt;br /&gt;
| Undefined for the System V ABI&lt;br /&gt;
|-&lt;br /&gt;
| 32-39&lt;br /&gt;
| Size of the segment in the file (p_filesz)&lt;br /&gt;
|-&lt;br /&gt;
| 40-47&lt;br /&gt;
| Size of the segment in memory (p_memsz)&lt;br /&gt;
|-&lt;br /&gt;
| 48-55&lt;br /&gt;
| The required alignment for this section (must be a power of 2)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Segment types: 0 = null - ignore the entry; 1 = load - clear p_memsz bytes at p_vaddr to 0, then copy p_filesz bytes from p_offset to p_vaddr; 2 = dynamic - requires dynamic linking; 3 = interp - contains a file path to an executable to use as an interpreter for the following segment;  4 = note section. There are more values, but mostly contain architecture/environment specific information, which is probably not required for the majority of ELF files.&lt;br /&gt;
&lt;br /&gt;
Flags: 1 = executable, 2 = writable, 4 = readable.&lt;br /&gt;
&lt;br /&gt;
== ELF파일의 로딩 ==&lt;br /&gt;
[[파일:Elfdiagram.png|섬네일]]&lt;br /&gt;
# ELF파일의 Magic이 일치하는지 확인한다.&lt;br /&gt;
# ELF파일의 첫부분에 있는 ELF헤더를 읽어서 ELF파일을 해석할 준비를 한다.&lt;br /&gt;
# ELF파일 헤더에 나타난 Executable헤더를 찾아가서 그 정보를 읽는다.&lt;br /&gt;
# 프로그램 헤더를 파싱해서, 프로그램 세그먼트를 몇개 로딩해야 하는지 구한다. 이떄 PT_LOAD type만이 로딩할수 있는 헤더이다.&lt;br /&gt;
# 각각의 로더블 세그먼트를 로딩한다. &lt;br /&gt;
## 각각의 세그먼트에 대한 Virtual memory를 할당하고 (p_vaddr)길이는 p_memsz만큼 할당한다.&lt;br /&gt;
## 세그먼트 데이터를 파일 오프셋 p_offset부터 p_filesz만큼 copy 한다.&lt;br /&gt;
## p_filesz와 p_memsz가 다르면 0으로 padding되었다는 것이다.&lt;/div&gt;</summary>
		<author><name>Ahn9807</name></author>
	</entry>
</feed>