stablyai/orca · error

[verify-linux-glibc-floor] objdump ${flag} failed for ${file

Error message

[verify-linux-glibc-floor] objdump ${flag} failed for ${filePath} (status ${result.status}, signal ${result.signal ?? 'none'}): ${(result.stderr || '').trim()}

What it means

objdump spawned successfully but exited non-zero or was killed by a signal. Because a truncated, corrupt, or unparseable binary must not slip past the glibc-floor gate, runObjdump treats any non-zero status or signal as fatal and reports the flag, status, signal, and trimmed stderr. This is the deliberate fail-closed contract documented above the function.

Source

Thrown at config/scripts/verify-linux-glibc-floor.cjs:257

/**
 * Run objdump with one flag on `filePath`. Fail-closed: a spawn error, non-zero
 * exit, or signal throws, because a silently-unreadable binary (truncated,
 * corrupt, or an objdump that cannot decode its format) would let a too-new
 * binary slip past the gate.
 */
function runObjdump(objdumpPath, flag, filePath) {
  const result = spawnSync(objdumpPath, [flag, filePath], {
    encoding: 'utf8',
    maxBuffer: 64 * 1024 * 1024,
    env: cLocaleEnv()
  })
  if (result.error) {
    throw new Error(
      `[verify-linux-glibc-floor] could not run objdump on ${filePath}: ${result.error.message}`
    )
  }
  if (result.signal || result.status !== 0) {
    throw new Error(
      `[verify-linux-glibc-floor] objdump ${flag} failed for ${filePath} ` +
        `(status ${result.status}, signal ${result.signal ?? 'none'}): ${(result.stderr || '').trim()}`
    )
  }
  return result.stdout || ''
}

/** DT_NEEDED shared-library names from `objdump -p` (`  NEEDED  <lib>`). */
function parseNeededLibraries(objdumpOutput) {
  const needed = new Set()
  for (const line of objdumpOutput.split('\n')) {
    const match = line.match(/^\s+NEEDED\s+(\S+)/)
    if (match) {
      needed.add(match[1])
    }
  }
  return needed
}

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Read the trimmed stderr in the message — it usually states the parse failure (e.g. 'File format not recognized').
  2. Rebuild the offending native module so its binary is complete and valid for the target arch.
  3. If the file is genuinely not an ELF native (false positive from collectNativeBinaries), exclude it from the scan or fix the collector's ELF magic check.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  const out = runObjdump(objdumpPath, '-p', filePath)
} catch (error) {
  // objdump parse failure => suspect corrupt/non-ELF; rebuild the module, do not skip
  console.error('objdump rejected', filePath, error.message)
  throw error
}

Prevention

When it happens

Trigger: result.signal is truthy OR result.status !== 0 at line 256. Happens when objdump cannot parse the file (not a valid ELF / truncated), when the bundled binary is for an architecture objdump doesn't support, or when objdump itself crashes (e.g. OOM-killed, signal).

Common situations: A bundled .node that is corrupt or a non-native artifact misclassified by collectNativeBinaries; cross-compiled binaries the host objdump can't decode; a partially-written binary from an interrupted build.

Related errors


AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12). Data as JSON: /api/errors/c268c2bc9b5ba888. Report an issue: GitHub.