record(SERVE-C-ABI): the ELF export guarantee is the version script alone, and the Apple leg links without it (#1535) - #1616
Merged
Conversation
…lone, and the Apple leg links without it (#1535) `cmake/vllm_export.map` makes every non-`vllm_*` symbol in the force-linked `vllm` archive local, which is what keeps `examples/video_studio/main.cpp` safe by construction: it links `vllm::shared`, `vllm_shared` links `vllm` PRIVATE, so the example compiles the vendored httplib header in the no-TLS layout while the library holds the TLS layout. `CPPHTTPLIB_OPENSSL_SUPPORT` is a whole-header switch over `httplib::Result` and `httplib::ClientConnection`, so the two definitions are ODR-incompatible and the script is what keeps them from meeting. This closes nothing. It records what is true, because the measurement needs a macOS host and this row has not taken one. `SERVE-C-ABI` had no `## Owed` section at all, so the only place the gap was written down was the issue index. Three things the issue does not say, each read off this tree. The version script is the ONLY mechanism. `vllm_shared` carries `CXX_VISIBILITY_PRESET hidden`, which looks like a second line of defence and is not: those properties apply to the target's own sources, and its only source is the generated empty stub. A repo-wide grep for `VISIBILITY_PRESET` returns exactly those two lines, so nothing compiles the archive hidden. The ELF leg is now MEASURED rather than argued. One Release CPU build, one build directory, `libvllm.so.0.0.3` linked twice from the same objects with only the `--version-script` argument removed: 48 dynamic defined symbols become 9376, of which 9329 are non-`vllm_*` and 734 are httplib, split 505 `W` / 209 `V` / 20 `u`. That is the export set the Apple leg has. "We have no macOS host" is the wrong summary. `release.yml` runs `metal_arm64` and `mlx_arm64` on `macos-15`. What it does not do is build either artifact this question is about: `build-macos-release.sh` configures examples ON and then builds `--target server test_metal_backend`, and `server` links `vllm::vllm`. So the dylib is never linked there and `video-studio` is never compiled there. The gap is a lane building the wrong two targets, not an absent machine. One narrowing for whoever measures it: `httplib::Result` has no out-of-line definition in either link, so grepping the export table for it finds nothing and that is not reassurance. The exported weak family is `httplib::ClientImpl` and its neighbours, whose signatures embed the layout-dependent types. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
cmake/vllm_export.mapmakes every non-vllm_*symbol in the force-linkedvllmarchive local, which is what keepsexamples/video_studio/main.cppsafeby construction: it links
vllm::shared,vllm_sharedlinksvllmPRIVATE, sothe example compiles the vendored httplib header in the no-TLS layout while the
library holds the TLS layout.
CPPHTTPLIB_OPENSSL_SUPPORTis a whole-headerswitch over
httplib::Resultandhttplib::ClientConnection, so the twodefinitions are ODR-incompatible and the script is what keeps them from meeting.
This closes nothing. It records what is true, because the measurement needs a
macOS host and this row has not taken one.
SERVE-C-ABIhad no## Owedsectionat all, so the only place the gap was written down was the issue index.
Three things the issue does not say, each read off this tree.
The version script is the ONLY mechanism.
vllm_sharedcarriesCXX_VISIBILITY_PRESET hidden, which looks like a second line of defence and isnot: those properties apply to the target's own sources, and its only source is
the generated empty stub. A repo-wide grep for
VISIBILITY_PRESETreturnsexactly those two lines, so nothing compiles the archive hidden.
The ELF leg is now MEASURED rather than argued. One Release CPU build, one build
directory,
libvllm.so.0.0.3linked twice from the same objects with only the--version-scriptargument removed: 48 dynamic defined symbols become 9376, ofwhich 9329 are non-
vllm_*and 734 are httplib, split 505W/ 209V/ 20u. That is the export set the Apple leg has."We have no macOS host" is the wrong summary.
release.ymlrunsmetal_arm64and
mlx_arm64onmacos-15. What it does not do is build either artifact thisquestion is about:
build-macos-release.shconfigures examples ON and thenbuilds
--target server test_metal_backend, andserverlinksvllm::vllm.So the dylib is never linked there and
video-studiois never compiled there.The gap is a lane building the wrong two targets, not an absent machine.
One narrowing for whoever measures it:
httplib::Resulthas no out-of-linedefinition in either link, so grepping the export table for it finds nothing and
that is not reassurance. The exported weak family is
httplib::ClientImplandits neighbours, whose signatures embed the layout-dependent types.
Refs #1535, which stays OPEN: this records the gap, it does not measure it.
FOLLOWING_AGENTS_PROTOCOL
Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]