почему при установке cygwin создаются разные файлы `bin / cyg * .dll`? - PullRequest
0 голосов
/ 30 октября 2018

Я повторил простую (то есть по умолчанию) установку 64-битного Cygwin с setup-x86_64.exe под одной и той же Windows 7 64-битной машиной, и каждый раз, когда Cygwin создает разные cyg*.dll под bin.

Созданные файлы имеют одинаковый размер и дату изменения. Но их контрольные суммы различаются (здесь md5sums bin/cygz.dll):

$ md5sum /cygdrive/w/cygwin1/bin/cygz.dll
c285271b9c04760e6041f56d8cad66de */cygdrive/w/cygwin1/bin/cygz.dll

$ md5sum /cygdrive/w/cygwin2/bin/cygz.dll
03e3384036922ceaa2a560ae9c584e6f */cygdrive/w/cygwin2/bin/cygz.dll

и их содержимое также различаются (здесь xxd bin/cygz.dll:

$ xxd -s 128 -l 16 /cygdrive/w/cygwin1/bin/cygz.dll
00000080: 5045 0000 6486 0c00 b144 d85b 004c 0100  PE..d....D.[.L..
                              ^^^^

$ xxd -s 128 -l 16 /cygdrive/w/cygwin2/bin/cygz.dll
00000080: 5045 0000 6486 0c00 b946 d85b 004c 0100  PE..d....F.[.L..
                              ^^^^

1 Ответ

0 голосов
/ 30 октября 2018

Контрольная сумма отличается тем, что dll нужно загружать по разным адресам друг от друга, чтобы избежать коллизий во время разветвления.
Адреса загрузки отличаются от тех, которые записаны в DLL во время сборки.
Вы можете увидеть адрес загрузки с rebase

$ rebase -si | head -n 5
/usr/libexec/coreutils/libstdbuf.so  base 0x0003781a0000 size 0x0000c000
/usr/lib/zsh/5.5.1/zsh/zutil.dll     base 0x0003781b0000 size 0x0000f000
/usr/lib/zsh/5.5.1/zsh/zselect.dll   base 0x0003781c0000 size 0x0000b000
/usr/lib/zsh/5.5.1/zsh/zpty.dll      base 0x0003781d0000 size 0x0000c000
/usr/lib/zsh/5.5.1/zsh/zprof.dll     base 0x0003781e0000 size 0x0000c000
 $ rebase -si | tail -n 5
/usr/bin/cyg4ti2util-0.dll           base 0x0003ffe70000 size 0x00018000
/usr/bin/cyg4ti2int64-0.dll          base 0x0003ffe90000 size 0x00068000
/usr/bin/cyg4ti2int32-0.dll          base 0x0003fff00000 size 0x00069000
/usr/bin/cyg4ti2gmp-0.dll            base 0x0003fff70000 size 0x00076000
/usr/bin/cyg4ti2common-0.dll         base 0x0003ffff0000 size 0x0000c000

назначение адреса загрузки в каждом dll выполняется скриптом

/etc/postinstall/0p_000_autorebase.dash

, который выполняется Cywin setup после каждой установки / обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...