Commit 6108d34
C 库要按它下面实际有的东西被配置 —— 以及那道守卫用错了判据 (#4)
* fix: 那十五个间接符号是编译器的产物,不是这个 port 的性质
链接线上的 --ld-path 读起来像「这个格式需要那个系统的链接器」,而重测表明
它的适用范围窄得多。
重测(2026-08-22,Linux,开源工具链):
1336 个 musl 单元 + 11 个 port 单元 + 9 个实现单元 = 1356 个对象,
为 arm64 与 x86_64 两个目标各编一遍,再换 clang 22.1.8 编一遍,
llvm-nm 数到的间接符号都是 0;而 lld 22.1.8 里那句 TODO 还在。
两者不矛盾:链接器的限制仍在,只是编译器不再产生够得着它的构造。那十五个
符号属于原测量所用的编译器 —— 那个系统自带的那个 —— 不属于这个 port,
不属于 musl,也不属于目标格式。
于是 ld64.lld 在 Linux 上就能把它们链成一个那个系统的可执行文件,
--ld-path 只在那个系统上用它自己的编译器原生构建时才需要。
tools/probe-cross-macos.sh 复现这两次测量,并且已经验证它会变红:
往 port/src 里加一个规范外的名字,两条断言和链接同时失败。
* deps: 改用 git + 分支跟随这条开发线
四条依赖全部指向 feat/openkal-closure。已实测整张图能解析并构建:
mcpp 逐个克隆分支,openkal-musl → openkal-linux → openkal 三层建成,
examples/posix 的 32 项断言 0 failures。
* fix: 内部头是 C,而消费者可以不是
musl 的构建通过 src/include 拿到自己的声明,那些头写成 C,把 restrict 当关键字
裸用;公开头用的是 __restrict,两种语言都接受。
这个包发布的正是它构建所用的那一套目录 —— 一套而不是两套,那是 mcpp.toml 记下的
决定 —— 所以 C++ 消费者也会够到 src/include。那里 restrict 不是关键字,于是
hidden struct tm *__gmtime_r(const time_t *restrict, struct tm *restrict);
被读成两个都叫 restrict 的参数,编译器判为重定义。实测:一个 include <vector>
的 C++ 翻译单元在碰到自己的任何东西之前就报四个这样的错。
关键字在这里给一个拼法,而不是去改 musl —— 另一条路是编辑这个 port 原样编译的
那 1345 个源文件。
ⓘ 这是次优解。最优解是让一个包区分「它构建所用的目录」与「它发布的目录」,
构建工具今天表达不了;有了它,内部覆盖层根本到不了消费者,也就不需要任何拼法。
注在这里,免得更好的修法被丢掉。
* fix: 内部头是 C,而消费者可以不是 —— 给出规则而不是逐条创可贴
musl 的构建通过 src/include 拿到自己的声明。这个包发布的正是它构建所用的那套
目录,所以消费者也会够到 src/include —— 而那里的一切都是为 C 写的。
规则:musl 自己的源文件是 C,永远不会被当成别的编译。所以一个 C++ 翻译单元
必然不是它们中的一个,src/include 为 musl 自己加的东西在这里全都是惰性的,
它唯一不该做的事是和消费者相撞。
三个名字,而且是被两个消费者一个一个撞出来的,不是读出来的:
restrict C 的关键字,C++ 的不是。f(int *restrict, int *restrict) 被读成
两个都叫 restrict 的参数。给它一个两种语言都接受的拼法。
hidden, weak musl 写成裸词的属性。置空而不是删掉,因为 src/include 的声明
在用它们,而一个 include <pthread.h> 的消费者会读到那些声明。
weak_alias 删掉而不是置空。它只出现在 musl 的 .c 里、任何头都不用它,
而留着会弄坏任何自己写 __attribute__((weak_alias(...))) 的
消费者 —— LLVM 的 libunwind 在十五处这么写,报的是
「use of undeclared identifier __weak__」。
ⓘ 这仍是次优解。最优解是让一个包区分「它构建所用的目录」与「它发布的目录」。
实测 2026-08-22:mcpp 表达不了 —— 把那两个目录挪进按 glob 限定的 flags,
它们在命令行上落到 include_dirs 之后,musl 自己的构建于是先找到公开的
<features.h>,报 `unknown type name hidden'。注在这里,免得更好的修法被丢掉。
验证:musl 构建通过;examples/posix 32 项断言 0 failures。
* fix: hidden 在 C++ 下给 C 链接,而不是置空
内部覆盖层加的每一条声明都以 hidden 开头 —— 那正是它的用途 —— 所以一个拼法
就让它们全部拿到它们本来被写成的链接。
覆盖层的头自己不带 extern "C",因为 musl 从不把它们当 C++ 编;一个把 hidden
置空的 C++ 消费者会把声明解析过去,然后在链接时对不上 musl 的定义。实测:
undefined symbol: ___errno_location()
did you mean: extern "C" ___errno_location
* fix: 程序头的指针丢了,而缺席被当成了答案
musl 从辅助向量回答 dl_iterate_phdr。这个 port 替换 __libc_start_main 正是为了
不去读那个向量 —— openkal 的实现没有义务留下一个,而这个包构建的三种格式里有
两种根本没有这种东西。替换之后,这条查询就没东西可报了。
1 parent 83c9bfe commit 6108d34
47 files changed
Lines changed: 4353 additions & 86 deletions
File tree
- .github/workflows
- examples/cross-hello
- src
- musl-generated
- aarch64-macos/bits
- riscv64/bits
- x86_64-windows/bits
- musl
- arch/riscv64
- bits
- port
- include
- sys
- src
- mach
- win
- tools
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
152 | 152 | | |
153 | 153 | | |
154 | 154 | | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
155 | 180 | | |
156 | 181 | | |
157 | 182 | | |
| |||
171 | 196 | | |
172 | 197 | | |
173 | 198 | | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
0 commit comments