Что может сломать / proc / self / exe? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть простая программа Go, которая вызывает os.Executable().В старых системах Linux (2.6.32) он не может прочитать /proc/self/exe, как показано strace -f myexe -v public_html/ |& head -30:

execve("/home/willem/myexe", ["myexe", "-v", "public_html/"], [/* 45 vars */]) = 0
mmap(0x1200000, 13352277, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, 0, 0) = 0x1200000
readlink("/proc/self/exe", "/hom/willem/my"..., 4096) = 37
mmap(0x400000, 13463552, PROT_NONE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x400000
mmap(0x400000, 10254571, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x400000
mprotect(0x400000, 10254571, PROT_READ|PROT_EXEC) = 0
mmap(0xfc7000, 938770, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0x9c7000) = 0xfc7000
mprotect(0xfc7000, 938770, PROT_READ|PROT_WRITE) = 0
mmap(0x10ad000, 170408, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x10ad000
munmap(0x1201000, 13348181)             = 0
uname({sys="Linux", node="sip5-83.nexcess.net", ...}) = 0
brk(0)                                  = 0x10d7000
brk(0x10d81c0)                          = 0x10d81c0
arch_prctl(ARCH_SET_FS, 0x10d7880)      = 0
set_tid_address(0x10d7b50)              = 16193
set_robust_list(0x10d7b60, 24)          = 0
rt_sigaction(SIGRTMIN, {0x83c310, [], SA_RESTORER|SA_SIGINFO, 0x83ba20}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0x83c3a0, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x83ba20}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=10240*1024, rlim_max=RLIM64_INFINITY}) = 0
readlink("/proc/self/exe", 0x7ffcfec64dc0, 4096) = -1 ENOENT (No such file or directory)

Я не понимаю, почему первая ссылка для чтения работает, а вторая - нет.Там нет форка и исполняемый файл не перемещен.Любые идеи?

Я могу это исправить, переместив os.Executable() в начало моей программы, но я хотел бы понять, почему он не работает как есть.

1 Ответ

0 голосов
/ 10 февраля 2019

Таким образом, причина оказалась UPX (исполняемый компрессор).Я не думал об этом раньше, потому что это было включено в мой конвейер сборки.По-видимому, в некоторых системах он не извлекается в память, а использует временный файл, что вызвало эту ошибку.Я все еще озадачен, почему вывод трассировки не показывает переименование, но увы.

...