Tool Comparison: Difference between revisions

From OSDev.wiki
Jump to navigation Jump to search
[unchecked revision][unchecked revision]
Content added Content deleted
No edit summary
m (use cite extension)
 
(40 intermediate revisions by 19 users not shown)
Line 1: Line 1:
This is a comparison of various osdev tools
This is a comparison of various operating system development tools.


==x86 Assemblers==
==x86 Assemblers==
<!--I'll fix this later, this is just an example-->
{| {{wikitable}}
{| {{wikitable}}
|-
|-
!
!
! colspan="2" | Syntax
! colspan="2" | Syntax
! colspan="3" | Output Format
! colspan="4" | Output Format
! colspan="3" | Instruction Set
! colspan="3" | Instruction Set
|-
|-
Line 15: Line 14:
! [[ELF]]
! [[ELF]]
! [[a.out]]
! [[a.out]]
! [[COFF]]
! flat
! flat
! 16 bit
! 16 bit
Line 20: Line 20:
! 64 bit
! 64 bit
|-
|-
! [[gas]]
! [[GAS]]
| {{Yes}}
| {{Yes}}
| {{Yes}}{{ref|1}}
| {{Yes}}<ref name="note1" group="Note" />
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}{{ref|2}}
| {{Yes}}
| {{Yes}}
| {{Yes}}{{ref|3}}
| {{Yes}}<ref name="note2" group="Note" />
| {{Yes}}
| {{Yes}}<ref name="note3" group="Note" />
|-
|-
! [[NASM]]
! [[NASM]]
Line 35: Line 36:
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}<ref name="note4" group="Note" />
|-
! [[YASM]]
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{No}}
| {{No}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
|-
|-
! [[Yasm]]
! [[FASM]]
| {{No}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{No}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
|-
! [[JWASM]]
| {{No}}
| {{No}}
| {{Yes}}
| {{Yes}}
| {{No}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
Line 50: Line 75:
| {{Yes}}
| {{Yes}}
|-
|-
! [[MASM]]<ref name="note5" group="Note" />
! [[fasm]]
| {{No}}
| {{No}}
| {{Yes}}
| {{Yes}}
| {{No}}
| {{No}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}<ref name="note6" group="Note" />
|-
! [[Sol_asm]]
| {{No}}
| {{No}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{No}}
| n/a
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
|-
! [[AS86]]
| {{No}}
| {{Yes}}
| {{No}}
| {{No}}
| {{No}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{No}}
|-
! [[LLVM|llvm-mc]]
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{No}}
| {{No}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
|}
|}


<references group="Note">
{{note|1}} using .intel_syntax directive
<ref name="note1">Using the <code>.intel_syntax</code> directive. Several opcodes will still use the AT&T name.</ref>

{{note|2}} While GAS normally writes only "pure" 32-bit i386 code, it has limited support for writing code to run in real mode or in 16-bit protected mode code segments. See [[http://www.gnu.org/software/binutils/manual/gas-2.9.1/html_chapter/as_16.html#SEC205 Here]]
<ref name="note2">While GAS normally writes only "pure" 32-bit i386 code, it has [http://sourceware.org/binutils/docs/as/i386_002d16bit.html limited support] for writing code to run in real mode or in 16-bit protected mode code segments.</ref>
<ref name="note3">You have to choose the instruction set at compile time (of the assembler). GAS can not assemble for more than one operating mode at a time, i.e. you would need one GAS for 32bit and one GAS for 64bit if you'd want to mix those two.</ref>

<ref name="note4">64-bit support is only available in NASM 2.x.</ref>
{{note|3}} You have to choose the instruction set at compile time. GAS can not assemble for more than one operating mode at a time
<ref name="note5">64-bit support is only available in a separate executable, named ml64.</ref>
<ref name="note6">Sol_Asm uses its own syntax, which looks like the Intel syntax.</ref>
</references>


==Compilers==
==Compilers==
Line 72: Line 134:
!
!
! Extensions
! Extensions
! colspan=4 | Output format
! colspan=8 | Output format
|-
|-
!
!
Line 80: Line 142:
! flat
! flat
! [[PE]]
! [[PE]]
! COFF
! 16-bit code segments
! 32-bit code segments
! 64-bit code segments
|-
|-
! gcc
! [[GCC]]
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| ?
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
|-
|-
! [[LLVM|Clang]]
! Visual Studio
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{No}}
| {{No}}
| {{Yes}}
| {{Yes}}
| {{No}}
| {{No}}
| {{Yes}}
| {{Yes}}
|-
! msvc
| {{Yes}}
| {{No}}
| {{No}}
| {{No}}
| {{No}}
| {{No}}<ref name="note7" group="Note" />
| {{Yes}}
| {{Yes}}
| {{Yes}}
| Version 4.X
| {{Yes}}
| {{Yes}}
|-
! icl
| {{Yes}}
| {{No}}
| {{No}}
| {{No}}
| {{Yes}}
| {{Yes}}
| {{No}}
| {{Yes}}
| {{Yes}}
|-
! [[Watcom]]
| {{Yes}}
| {{No}}
| {{No}}
| {{No}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
|-
! [[Smaller C]]
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{No}}
| {{Yes}} (incl. huge & unreal mode(l)s)<ref name="note8" group="Note" />
| {{Yes}}
| {{No}}
|}
|}

<references group="Note">
<ref name="note7">Visual Studio can emit <code>.COM</code> files.</ref>
<ref name="note8">Smaller C [https://github.com/alexfru/SmallerC/pull/25#issuecomment-516694067| wasn't really designed to properly support 16-bit and 64-bit CPUs].</ref>
</references>

==Linkers==
{| {{wikitable}}
|-
! rowspan=2 | Name
! colspan=5 | Input
! colspan=5 | Output
! rowspan=2 | Flat Binary Images
! rowspan=2 | Set Code Address
! rowspan=2 | Library Support
! rowspan=2 | Supports Debug Info
! rowspan=2 | 32bit Code
|-
! OMF/ OBJ
! Win32/ COFF
! ELF
! A.OUT
! Others
! Win32/ PE
! Win32/ DLL
! ELF
! A.OUT
! Others
|-
! [[JLoc]]
| {{Yes}}
|
|
|
|
| {{No}}
| {{No}}
| {{No}}
| {{No}}
| DOS/COM
| {{Yes}}
| {{Yes}}
| {{No}}
| OMF/OBJ
| {{Yes}}
|-
! [[ALink]]
| {{Yes}}
| {{Yes}}
| {{No}}
| {{No}}
| DJGPP/COFF
| {{Yes}}
| {{Yes}}
| {{No}}
| {{No}}
| DOS/COM DOS/EXE
| {{No}}
| {{Yes}}
| {{Yes}}
| {{No}}
| {{Yes}}
|-
! [[LD]]
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| DJGPP/COFF OMF/COFF
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{Yes}}
| various
| {{Yes}}
| {{Yes}}
| {{Yes}}
| ECOFF DWARF STABS
| {{Yes}}
|-
! [[TLink]]
| {{Yes}}
| {{Yes}}
| {{No}}
| {{No}}
|
| {{Yes}}
| {{Yes}}
| {{No}}
| {{No}}
| DOS/EXE DOS/COM
| {{No}}
| {{Yes}}
| {{Yes}}
| OMF/OBJ
| {{Yes}}
|-
! [[Link]]
| {{Yes}}
| {{Yes}}
| {{No}}
| {{No}}
|
| {{Yes}}
| {{Yes}}
| {{No}}
| {{No}}
| DOS/EXE DOS/COM LE
| {{No}}
| {{Yes}}
| {{Yes}}
| CODEVIEW DWARF
| {{Yes}}
|-
! [[VAL]]
| {{Yes}}
|
|
|
|
| {{No}}
| {{No}}
| {{No}}
| {{No}}
| DOS/EXE
| {{No}}
| {{No}}
| {{No}}
| {{Yes}}
| {{No}}
|-
! [[WLink]]
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{No}}
|
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{No}}
| DOS/EXE DOS/COM LE Pharlap Novell_NLM Causeway QNX
| {{Yes}}
| {{Yes}}
| {{Yes}}
| WATCOM CODEVIEW DWARF
| {{Yes}}
|-
! [[smlrl]]
| {{No}}
| {{No}}
| {{Yes}}
| {{No}}
|
| {{Yes}}
| {{No}}
| {{Yes}}
| {{Yes}}
| DOS/COM DOS/EXE MACH-O
| {{Yes}}
| {{Yes}}
| {{Yes}}
| {{No}}
| {{Yes}}
|-
! [[LLVM|LLD]]
|
| {{Yes}}
| {{Yes}}
|
|
|
|
|
|
|
|
|
| {{Yes}}
|
| {{Yes}}
|}

[[Category:Tools]]

Latest revision as of 11:53, 17 June 2024

This is a comparison of various operating system development tools.

x86 Assemblers

Syntax Output Format Instruction Set
AT&T Intel ELF a.out COFF flat 16 bit 32 bit 64 bit
GAS Yes Yes[Note 1] Yes Yes Yes Yes Yes[Note 2] Yes Yes[Note 3]
NASM No Yes Yes Yes Yes Yes Yes Yes Yes[Note 4]
YASM Yes Yes Yes No Yes Yes Yes Yes Yes
FASM No Yes Yes No Yes Yes Yes Yes Yes
JWASM No Yes Yes No Yes Yes Yes Yes Yes
MASM[Note 5] No Yes No No Yes Yes Yes Yes Yes[Note 6]
Sol_asm No Yes Yes No n/a Yes Yes Yes Yes
AS86 No Yes No No No Yes Yes Yes No
llvm-mc Yes Yes Yes Yes Yes No No Yes Yes
  1. Using the .intel_syntax directive. Several opcodes will still use the AT&T name.
  2. While GAS normally writes only "pure" 32-bit i386 code, it has limited support for writing code to run in real mode or in 16-bit protected mode code segments.
  3. You have to choose the instruction set at compile time (of the assembler). GAS can not assemble for more than one operating mode at a time, i.e. you would need one GAS for 32bit and one GAS for 64bit if you'd want to mix those two.
  4. 64-bit support is only available in NASM 2.x.
  5. 64-bit support is only available in a separate executable, named ml64.
  6. Sol_Asm uses its own syntax, which looks like the Intel syntax.

Compilers

Extensions Output format
Inline Assembly ELF a.out flat PE COFF 16-bit code segments 32-bit code segments 64-bit code segments
GCC Yes Yes Yes Yes Yes Yes ? Yes Yes
Clang Yes Yes Yes No Yes Yes No Yes Yes
msvc Yes No No No[Note 1] Yes Yes Version 4.X Yes Yes
icl Yes No No No Yes Yes No Yes Yes
Watcom Yes No No No Yes Yes Yes Yes Yes
Smaller C Yes Yes Yes Yes Yes No Yes (incl. huge & unreal mode(l)s)[Note 2] Yes No
  1. Visual Studio can emit .COM files.
  2. Smaller C wasn't really designed to properly support 16-bit and 64-bit CPUs.

Linkers

Name Input Output Flat Binary Images Set Code Address Library Support Supports Debug Info 32bit Code
OMF/ OBJ Win32/ COFF ELF A.OUT Others Win32/ PE Win32/ DLL ELF A.OUT Others
JLoc Yes No No No No DOS/COM Yes Yes No OMF/OBJ Yes
ALink Yes Yes No No DJGPP/COFF Yes Yes No No DOS/COM DOS/EXE No Yes Yes No Yes
LD Yes Yes Yes Yes DJGPP/COFF OMF/COFF Yes Yes Yes Yes various Yes Yes Yes ECOFF DWARF STABS Yes
TLink Yes Yes No No Yes Yes No No DOS/EXE DOS/COM No Yes Yes OMF/OBJ Yes
Link Yes Yes No No Yes Yes No No DOS/EXE DOS/COM LE No Yes Yes CODEVIEW DWARF Yes
VAL Yes No No No No DOS/EXE No No No Yes No
WLink Yes Yes Yes No Yes Yes Yes No DOS/EXE DOS/COM LE Pharlap Novell_NLM Causeway QNX Yes Yes Yes WATCOM CODEVIEW DWARF Yes
smlrl No No Yes No Yes No Yes Yes DOS/COM DOS/EXE MACH-O Yes Yes Yes No Yes
LLD Yes Yes Yes Yes