Switch to the C version officially, and make some minor modifications to ensure cross-architecture compatibility is maximized

This commit is contained in:
Tianon Gravi 2016-06-29 16:30:19 -07:00
parent f55431e897
commit 85fd7ab65e
12 changed files with 64 additions and 149 deletions

View File

@ -1,10 +1,17 @@
# explicitly use Debian for maximum cross-architecture compatibility
FROM debian:jessie
RUN apt-get update && apt-get install -y make nasm && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
libc6-dev \
make \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /usr/src/hello
COPY . .
RUN make clean all test
RUN set -x \
&& make clean all test \
&& ls -l */hello
CMD ["./hello-world/hello"]

View File

@ -1,3 +0,0 @@
FROM scratch
COPY hello /
CMD ["/hello"]

View File

@ -1,24 +1,21 @@
IMAGES := \
hello-world \
hola-mundo \
hello-seattle
C_TARGETS := $(addsuffix hello, $(wildcard */))
ASM_TARGETS := $(addsuffix /hello, $(IMAGES))
CC := gcc
CFLAGS := -static -Os -nostartfiles -fno-asynchronous-unwind-tables
.PHONY: all
all: $(ASM_TARGETS)
all: $(C_TARGETS)
$(ASM_TARGETS): hello.asm
mkdir -p '$(dir $@)'
nasm -o '$@' -DDOCKER_IMAGE="'$$(dirname '$@')'" '$<'
chmod +x '$@'
$(C_TARGETS): hello.c
$(CC) $(CFLAGS) -o '$@' -D DOCKER_IMAGE='"$(@D)"' -D DOCKER_GREETING="\"$$(cat '$(@D)/greeting.txt')\"" '$<'
strip -R .comment -s '$@'
.PHONY: clean
clean:
-rm -vrf $(addsuffix /, $(IMAGES))
-rm -vrf $(C_TARGETS)
.PHONY: test
test: $(ASM_TARGETS)
test: $(C_TARGETS)
@for b in $^; do \
( set -x && "./$$b" ); \
( set -x && "./$$b" | grep -q '"'"$$(dirname "$$b")"'"' ); \

View File

@ -0,0 +1 @@
Hello from DockerCon 2016 (Seattle)!

Binary file not shown.

1
hello-world/greeting.txt Normal file
View File

@ -0,0 +1 @@
Hello from Docker!

Binary file not shown.

View File

@ -1,93 +0,0 @@
; this is especially thanks to:
; http://web.archive.org/web/20140528193301/http://blog.markloiseau.com/2012/05/tiny-64-bit-elf-executables
BITS 64
org 0x00400000 ; Program load offset
; 64-bit ELF header
ehdr:
; 1), 0 (ABI ver.)
db 0x7F, "ELF", 2, 1, 1, 0 ; e_ident
times 8 db 0 ; reserved (zeroes)
dw 2 ; e_type: Executable file
dw 0x3e ; e_machine: AMD64
dd 1 ; e_version: current version
dq _start ; e_entry: program entry address (0x78)
dq phdr - $$ ; e_phoff program header offset (0x40)
dq 0 ; e_shoff no section headers
dd 0 ; e_flags no flags
dw ehdrsize ; e_ehsize: ELF header size (0x40)
dw phdrsize ; e_phentsize: program header size (0x38)
dw 1 ; e_phnum: one program header
dw 0 ; e_shentsize
dw 0 ; e_shnum
dw 0 ; e_shstrndx
ehdrsize equ $ - ehdr
; 64-bit ELF program header
phdr:
dd 1 ; p_type: loadable segment
dd 5 ; p_flags read and execute
dq 0 ; p_offset
dq $$ ; p_vaddr: start of the current section
dq $$ ; p_paddr: " "
dq filesize ; p_filesz
dq filesize ; p_memsz
dq 0x200000 ; p_align: 2^11=200000 = section alignment
; program header size
phdrsize equ $ - phdr
; Hello World!/your program here
_start:
; sys_write(stdout, message, length)
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rsi, message ; message address
mov rdx, length ; message string length
syscall
; sys_exit(return_code)
mov rax, 60 ; sys_exit
mov rdi, 0 ; return 0 (success)
syscall
%ifndef DOCKER_IMAGE
%define DOCKER_IMAGE 'hello-world'
%endif
message:
db 0x0A
%ifidn DOCKER_IMAGE, 'hola-mundo'
db '¡Hola de DockerCon EU 2015 (Barcelona)!', 0x0A
%elifidn DOCKER_IMAGE, 'hello-seattle'
db 'Hello from DockerCon 2016 (Seattle)!', 0x0A
%else
db 'Hello from Docker!', 0x0A
%endif
db 'This message shows that your installation appears to be working correctly.', 0x0A
db 0x0A
db 'To generate this message, Docker took the following steps:', 0x0A
db ' 1. The Docker client contacted the Docker daemon.', 0x0A
db ' 2. The Docker daemon pulled the "', DOCKER_IMAGE, '" image from the Docker Hub.', 0x0A
db ' 3. The Docker daemon created a new container from that image which runs the', 0x0A
db ' executable that produces the output you are currently reading.', 0x0A
db ' 4. The Docker daemon streamed that output to the Docker client, which sent it', 0x0A
db ' to your terminal.', 0x0A
db 0x0A
db 'To try something more ambitious, you can run an Ubuntu container with:', 0x0A
db ' $ docker run -it ubuntu bash', 0x0A
db 0x0A
db 'Share images, automate workflows, and more with a free Docker Hub account:', 0x0A
db ' https://hub.docker.com', 0x0A
db 0x0A
db 'For more examples and ideas, visit:', 0x0A
db ' https://docs.docker.com/engine/userguide/', 0x0A
db 0x0A
length: equ $-message ; message length calculation
; File size calculation
filesize equ $ - $$

36
hello.c
View File

@ -1,21 +1,22 @@
/* hello.c
//#include <unistd.h>
#include <sys/syscall.h>
build with:
#ifndef DOCKER_IMAGE
#define DOCKER_IMAGE "hello-world"
#endif
gcc -nostartfiles -fno-asynchronous-unwind-tables -Os -static -o hello hello.c
strip -R .comment -s hello
#ifndef DOCKER_GREETING
#define DOCKER_GREETING "Hello from Docker!"
#endif
*/
#include <unistd.h>
const char message[] = "\n"
"Hello from Docker.\n"
const char message[] =
"\n"
DOCKER_GREETING "\n"
"This message shows that your installation appears to be working correctly.\n"
"\n"
"To generate this message, Docker took the following steps:\n"
" 1. The Docker client contacted the Docker daemon.\n"
" 2. The Docker daemon pulled the \"hello-world\" image from the Docker Hub.\n"
" 2. The Docker daemon pulled the \"" DOCKER_IMAGE "\" image from the Docker Hub.\n"
" 3. The Docker daemon created a new container from that image which runs the\n"
" executable that produces the output you are currently reading.\n"
" 4. The Docker daemon streamed that output to the Docker client, which sent it\n"
@ -28,12 +29,13 @@ const char message[] = "\n"
" https://hub.docker.com\n"
"\n"
"For more examples and ideas, visit:\n"
" https://docs.docker.com/userguide/\n"
" https://docs.docker.com/engine/userguide/\n"
"\n";
void _start()
{
write(1, message, sizeof(message)-1);
_exit(0);
}
void _start() {
//write(1, message, sizeof(message) - 1);
syscall(SYS_write, 1, message, sizeof(message) - 1);
//_exit(0);
syscall(SYS_exit, 0);
}

1
hola-mundo/greeting.txt Normal file
View File

@ -0,0 +1 @@
¡Hola de DockerCon EU 2015 (Barcelona)!

Binary file not shown.

View File

@ -4,13 +4,15 @@ set -e
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
set -x
docker build -f Dockerfile.build -t hello-world:build .
rm -rf */
docker run --rm hello-world:build sh -c 'tar -c */' | tar -x
for d in */; do
d="${d%/}"
cp -v Dockerfile.template "$d/Dockerfile"
"./$d/hello" > /dev/null
rm -rf */hello
docker run --rm hello-world:build sh -c 'tar --create */hello' | tar --extract --wildcards '*/hello'
for h in */hello; do
d="$(dirname "$h")"
"$h" > /dev/null
docker build -t hello-world:"test-$d" "$d"
docker run --rm hello-world:"test-$d"
done