cygwin - 为什么 cygwin 安装会创建不同的 `bin/cyg*.dll` 文件?
问题描述
我已经在同一台 Windows 7 64 位机器下重复了普通(即默认)cygwin 64 位安装,setup-x86_64.exe
并且每次 cygwincyg*.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..
^^^^
解决方案
校验和是不同的,因为 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
setup
每次安装/更新后由 Cywin 执行。
推荐阅读
- c# - 将部分 XML 绑定为数据源
- jenkins - jenkins-io 和 jenkins-ci.org 中的不同 Jenkins 版本
- python - 将 pandas.read_sql_query 与 PostgreSQL 一起使用会返回 Empty DataFrame
- vue.js - 动态图片绑定vue js
- javascript - Javascript:获取用户名列表到控制台/文件
- angular - 角度谷歌地图方向 - 如何绑定起点和目的地
- mongodb - 如何在 MongoDB 中使用一个查询更新多个文档
- laravel - Laravel 主键增量在 eloquent 和迁移中
- sql - SQL 创建表和数据
- php - 如何使用 php 和 mysql 使用谷歌图表创建堆积条形图?