All from the blog post linked in the question comments; this is not my work, all credit goes to Brian Raiter:
https://www.muppetlabs.com/~breadbox/software/tiny/return42.html
NASM (32-bit Linux ELF), 45 bytes
BITS 32
org 0x00010000
db 0x7F, "ELF"
dd 1
dd 0
dd $$
dw 2
dw 3
dd _start
dd _start
dd 4
_start: mov bl, 42 ; set ebx to exit code 42
xor eax, eax ; set eax to 1 (exit syscall)
inc eax
int 0x80 ; and exit
db 0
dw 0x34
dw 0x20
db 1
filesize equ $ - $$
(https://www.muppetlabs.com/~breadbox/software/tiny/tiny-i386.asm.txt)
NASM (64-bit Linux ELF), 80 bytes
BITS 64
org 0x500000000
db 0x7F ; e_ident
_start: db "ELF" ; 3 REX prefixes (no effect)
and eax, 0x00000101
lea edi, [rax + 42] ; rdi = exit code
mov al, 60 ; rax = syscall number
syscall ; exit(rdi)
dw 2 ; e_type
dw 62 ; e_machine
dd 1 ; e_version
phdr: dd 1 ; e_entry ; p_type
dd 5 ; p_flags
dq phdr - $$ ; e_phoff ; p_offset
dq phdr ; e_shoff ; p_vaddr
dd 0 ; e_flags ; p_paddr
dw 0x40 ; e_ehsize
dw 0x38 ; e_phentsize
dw 1 ; e_phnum ; p_filesz
dw 0x40 ; e_shentsize
dw 0 ; e_shnum
dw 0 ; e_shstrndx
dq 0x00400001 ; p_memsz
dq 0 ; p_align
(https://www.muppetlabs.com/~breadbox/software/tiny/tiny-x64.asm.txt)
NASM (Linux a.out), 35 bytes
BITS 32
org 0x1000
; a.out header
dd 0x006400CC ; a_info
dd filesize ; a_text
dd 0 ; a_data
_start: mov bl, 42 ; set exit code ; a_bss
jmp short part2
dd 0 ; a_syms
dd _start ; a_entry
dd 0 ; a_trsize
dd 0 ; a_drsize
part2: inc eax ; set syscall number
int 0x80 ; exit(ebx)
filesize equ $ - $$
(https://www.muppetlabs.com/~breadbox/software/tiny/tiny-aout.asm.txt)