Skip to content

Instantly share code, notes, and snippets.

@mapk0y
Last active April 21, 2016 17:29
Show Gist options
  • Save mapk0y/aec9e42d20377e739f08e1aee922098a to your computer and use it in GitHub Desktop.
Save mapk0y/aec9e42d20377e739f08e1aee922098a to your computer and use it in GitHub Desktop.
alpine と golang(net)

golang は linuxbrew (多分インストール処理としては go1.4 のバイナリを落としてきて 1.6 を build)

[mapk0y@kona:~]$ docker pull alpine:latest
latest: Pulling from library/alpine

420890c9e918: Pull complete 
Digest: sha256:9cacb71397b640eca97488cf08582ae4e4068513101088e9f96c9814bfda95e0
Status: Downloaded newer image for alpine:latest
[mapk0y@kona:~]$ cd alpine-go-net-sample/
[mapk0y@kona:~/alpine-go-net-sample](master)$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 8.4 (jessie)
Release:	8.4
Codename:	jessie
[mapk0y@kona:~/alpine-go-net-sample](master)$ go version
go version go1.6 linux/amd64
[mapk0y@kona:~/alpine-go-net-sample](master)$ CGO_ENABLED=0 go build -a -installsuffix cgo -o static_bin ./
[mapk0y@kona:~/alpine-go-net-sample](master)$ go build -a -o dynamic_bin ./
[mapk0y@kona:~/alpine-go-net-sample](master)$ ls -l *_bin
-rwxr-xr-x 1 mapk0y mapk0y 3574704  4月 22 02:03 dynamic_bin*
-rwxr-xr-x 1 mapk0y mapk0y 3526640  4月 22 02:02 static_bin*
[mapk0y@kona:~/alpine-go-net-sample](master)$ ldd *_bin
dynamic_bin:
	linux-vdso.so.1 (0x00007ffdfb3be000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f364fafe000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f364f753000)
	/lib64/ld-linux-x86-64.so.2 (0x00005610830f0000)
static_bin:
	not a dynamic executable
[mapk0y@kona:~/alpine-go-net-sample](master)$ docker run -v ${PWD}:/work alpine:latest /work/dynamic_bin
docker: Error response from daemon: Container command '/work/dynamic_bin' not found or does not exist..
[mapk0y@kona:~/alpine-go-net-sample](master)$ docker run -v ${PWD}:/work alpine:latest /work/static_bin
HTTP/1.0 302 Found

バイナリの中身

[mapk0y@kona:~/alpine-go-net-sample](master)$ readelf -l dynamic_bin 

Elf file type is EXEC (Executable file)
Entry point 0x45bea0
There are 10 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
                 0x0000000000000230 0x0000000000000230  R      1000
  INTERP         0x0000000000000fe4 0x0000000000400fe4 0x0000000000400fe4
                 0x000000000000001c 0x000000000000001c  R      1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  NOTE           0x0000000000000fac 0x0000000000400fac 0x0000000000400fac
                 0x0000000000000038 0x0000000000000038  R      4
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x000000000010dd10 0x000000000010dd10  R E    1000
  LOAD           0x000000000010e000 0x000000000050e000 0x000000000050e000
                 0x0000000000136d08 0x0000000000136d08  R      1000
  LOAD           0x0000000000245000 0x0000000000645000 0x0000000000645000
                 0x0000000000014380 0x00000000000340a0  RW     1000
  DYNAMIC        0x0000000000245100 0x0000000000645100 0x0000000000645100
                 0x0000000000000130 0x0000000000000130  RW     8
  TLS            0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000008  R      8
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     8
  LOOS+5041580   0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000         8

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .interp 
   02     .note.go.buildid 
   03     .text .plt .interp .note.go.buildid 
   04     .rodata .typelink .gosymtab .gopclntab .rela .rela.plt .gnu.version .gnu.version_r .hash .shstrtab .dynstr .dynsym 
   05     .got.plt .dynamic .got .noptrdata .data .bss .noptrbss 
   06     .dynamic 
   07     .tbss 
   08     
   09     
[mapk0y@kona:~/alpine-go-net-sample](master)$ docker run alpine:latest ls -l /lib64/ld-linux-x86-64.so.2
ls: /lib64/ld-linux-x86-64.so.2: No such file or directory

これがどうにか解決できても、musl libc は glibc と名前解決の扱いがちがう(dns search を見なかったり)ので static build が良いと思う

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment