Skip to content

Add support for .obj files in COFF - #64

Open
topolarity wants to merge 3 commits into
JuliaIO:masterfrom
topolarity:ct/coff-objects
Open

topolarity wants to merge 3 commits into
JuliaIO:masterfrom
topolarity:ct/coff-objects

Conversation

@topolarity

Copy link
Copy Markdown
Collaborator

Dependent on #63 .

Beyond increasing our format support, this is required to be able to distinguish MSVC-style import libraries on Windows. These files are pure COFF (no PE / COFF header, as in a usual PE image) so the "optional" header is finally truly optional.

Also fix a bug where COFFSymbols would report garbage / erroneous symbols, due to iterating auxiliary symbols incorrectly.

Assisted-by: Claude Code (Opus 5.5)

topolarity and others added 3 commits October 8, 2026 12:28
Static libraries (`libfoo.a`, `foo.lib`) are `ar` archives of object
files.  `readmeta(io, ArchiveHandle)` lists an archive's members, and
`readmeta(ah, member)` / `read(ah, member)` open one as an object file
or read its contents.  Each member starts with an `ArchiveMemberHeader`.

`ar` has no single specification: each kind of archive (GNU, BSD and
COFF, and the 64-bit variants of the former two) indexes its symbols
and stores long member names in members of its own reserved names.
As in LLVM, the kind is determined once from the first member(s), see
`archive_kind()`, and member names are then decoded by that kind's
rules only, with its symbol and name tables only accepted where they
belong.  GNU thin archives, whose members are stored outside of the
archive, are supported too.

`ArchiveHandle` is not registered in `ObjTypes`, so `readmeta(io)`
still only returns object files: existing callers that iterate the
result of `readmeta(io)` would otherwise start receiving archives.

The test fixtures are generated by `test/archives/build.sh`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
COFF symbol table entries may be followed by auxiliary records, which
`scan_symbol_offsets()` found but `Symbols` never used: iterating a
`COFFSymbols` listed every record, auxiliary or not, as a symbol.  It
also stopped one record short, dropping a final symbol without any.

Index through the scanned (non-auxiliary) symbol table indices instead.
`symbol_number()` remains the symbol's index within the symbol table.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Object files (e.g. `foo.obj`, or the members of `foo.lib`) have no MZ
stub, PE signature or optional header: they start directly with their
COFF header.  `readmeta(io, COFFHandle)` now falls back to reading one,
identifying it by its `Machine` (which is all the magic an object has)
and a header consistent with an object of its size.  Such handles have
no `opt_header`, and no `DynamicLinks`.

Also:
 - Add the ARM64EC and ARM64X machine types.
 - Only prefix symbols with an underscore on 32-bit x86, not on all
   32-bit architectures (e.g. ARMv7).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@codecov

codecov Bot commented Oct 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 94.57831% with 9 lines in your changes missing coverage. Please review.
✅ Project coverage is 72.25%. Comparing base (815c42e) to head (2084b8a).

Files with missing lines Patch % Lines
src/Archive/Archive.jl 94.21% 7 Missing ⚠️
src/COFF/COFFHandle.jl 96.29% 1 Missing ⚠️
src/COFF/COFFSymbol.jl 93.33% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master      #64      +/-   ##
==========================================
+ Coverage   69.94%   72.25%   +2.31%     
==========================================
  Files          46       47       +1     
  Lines        1364     1514     +150     
==========================================
+ Hits          954     1094     +140     
- Misses        410      420      +10     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant