@@ -471,21 +471,36 @@ def do_emscripten(infile, memfile):
471
471
return outfile
472
472
473
473
474
+ def is_ar_file_with_missing_index (archive_file ):
475
+ # We parse the archive header outselves because llvm-nm --print-armap is slower and less
476
+ # reliable.
477
+ # See: https://github.com/emscripten-core/emscripten/issues/10195
478
+ archive_header = b'!<arch>\n '
479
+ file_header_size = 60
480
+
481
+ with open (archive_file ) as f :
482
+ header = f .read (len (archive_header ))
483
+ if header != archive_header :
484
+ # This is not even an ar file
485
+ return False
486
+ file_header = f .read (file_header_size )
487
+ if len (file_header ) != file_header_size :
488
+ # We don't have any file entires at all so we don't consider the index missing
489
+ return False
490
+
491
+ name = file_header [:16 ].strip ()
492
+ # If '/' is the name of the first file we have an index
493
+ return name != '/'
494
+
495
+
474
496
def ensure_archive_index (archive_file ):
475
497
# Fastcomp linking works without archive indexes.
476
498
if not shared .Settings .WASM_BACKEND or not shared .Settings .AUTO_ARCHIVE_INDEXES :
477
499
return
478
- # Ignore stderr since llvm-nm prints "no symbols" to stderr for each object that has no symbols
479
- stdout = run_process ([shared .LLVM_NM , '--print-armap' , archive_file ], stdout = PIPE , stderr = PIPE ).stdout
480
- stdout = stdout .strip ()
481
- # Ignore empty archives
482
- if not stdout :
483
- return
484
- if stdout .startswith ('Archive map\n ' ) or stdout .startswith ('Archive index\n ' ):
485
- return
486
- shared .warning ('%s: archive is missing an index; Use emar when creating libraries to ensure an index is created' , archive_file )
487
- shared .warning ('%s: adding index' , archive_file )
488
- run_process ([shared .LLVM_RANLIB , archive_file ])
500
+ if is_ar_file_with_missing_index (archive_file ):
501
+ shared .warning ('%s: archive is missing an index; Use emar when creating libraries to ensure an index is created' , archive_file )
502
+ shared .warning ('%s: adding index' , archive_file )
503
+ run_process ([shared .LLVM_RANLIB , archive_file ])
489
504
490
505
491
506
#
0 commit comments