{"record":{"id":"0c32bd54985123ff","repo":"stablyai/orca","slug":"verify-linux-glibc-floor-objdump-not-found-inst","errorCode":null,"errorMessage":"[verify-linux-glibc-floor] objdump not found. Install binutils on the Linux packaging host so the glibc-floor gate can inspect bundled native binaries.","messagePattern":"\\[verify-linux-glibc-floor\\] objdump not found\\. Install binutils on the Linux packaging host so the glibc-floor gate can inspect bundled native binaries\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"config/scripts/verify-linux-glibc-floor.cjs","lineNumber":324,"sourceCode":"\n/**\n * Fail Linux packaging if any bundled native binary under `rootDir` requires a\n * glibc/libstdc++ symbol version newer than the floor OS. No-op is not allowed\n * on Linux: a missing objdump throws, because a silent skip would defeat the\n * regression gate on exactly the host where it matters.\n */\nfunction verifyLinuxGlibcFloor(rootDir, options = {}) {\n  const binaries = collectNativeBinaries(rootDir)\n  if (binaries.length === 0) {\n    console.log(`[verify-linux-glibc-floor] OK — no bundled native binaries under ${rootDir}`)\n    return\n  }\n\n  // Why: resolve objdump only once there is something to inspect, so a fixture\n  // with no ELF binaries does not fail on a host that lacks binutils.\n  const objdumpPath = resolveObjdump(options.objdumpPath)\n  if (!objdumpPath) {\n    throw new Error(\n      '[verify-linux-glibc-floor] objdump not found. Install binutils on the Linux ' +\n        'packaging host so the glibc-floor gate can inspect bundled native binaries.'\n    )\n  }\n\n  const offenders = []\n  for (const filePath of binaries) {\n    const { versionNeeds, neededLibraries } = readDynamicInfo(filePath, objdumpPath)\n    const floorViolations = findFloorViolations(versionNeeds, filePath)\n    // Only pay for `objdump -T` when a relocated-symbol provider is not already\n    // in DT_NEEDED (the common, healthy case short-circuits without it).\n    const providerViolations = Object.values(RELOCATED_SYMBOL_PROVIDERS).some(\n      (library) => !neededLibraries.has(library)\n    )\n      ? findMissingProviderDeps(readImportedSymbols(filePath, objdumpPath), neededLibraries)\n      : []\n    if (floorViolations.length > 0 || providerViolations.length > 0) {\n      offenders.push({ filePath, floorViolations, providerViolations })","sourceCodeStart":306,"sourceCodeEnd":342,"githubUrl":"https://github.com/stablyai/orca/blob/1136503c6a231a16dce8f921f6fadb63d181e8db/config/scripts/verify-linux-glibc-floor.cjs#L306-L342","documentation":"verifyLinuxGlibcFloor collected one or more native binaries under rootDir but resolveObjdump() could not find an objdump binary on PATH (or via options.objdumpPath). The gate refuses to skip: a missing objdump on exactly the Linux packaging host where it matters would let a glibc-regression slip through, so it fails loudly instructing the user to install binutils. This only fires when there is something to inspect; an empty binary list short-circuits OK.","triggerScenarios":"collectNativeBinaries(rootDir).length > 0 AND resolveObjdump(options.objdumpPath) returns falsy at line 322-323. Reproduced by running the gate in a minimal container/runner image without binutils installed, or with options.objdumpPath pointing at a nonexistent path.","commonSituations":"A slimmed CI Docker image (e.g. node:alpine or a distroless variant) lacking binutils; a custom runner where objdump was removed; passing a wrong options.objdumpPath.","solutions":["Install binutils on the packaging host: Debian/Ubuntu `apt-get install -y binutils`, Fedora `dnf install -y binutils`, Alpine `apk add --no-cache binutils`.","If installing is impossible, pass a valid options.objdumpPath pointing at an existing objdump binary.","Do NOT work around it by skipping the gate — that defeats the regression protection."],"exampleFix":"# before\n# (slim runner, no binutils)\nnode config/scripts/verify-linux-glibc-floor.cjs out/linux-unpacked\n# after\napt-get update && apt-get install -y binutils\nnode config/scripts/verify-linux-glibc-floor.cjs out/linux-unpacked","handlingStrategy":"validation","validationCode":"import { execFileSync } from 'node:child_process'\nfunction hasObjdump(): boolean {\n  try { execFileSync('which', ['objdump'], { stdio: 'ignore' }); return true } catch { return false }\n}\nif (!hasObjdump()) {\n  console.error('Install binutils before running the glibc-floor gate.')\n  process.exit(1)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Add `binutils` to the base package list of every Linux packaging/CI image.","Do not disable or skip the gate when objdump is missing — install it."],"tags":["linux","packaging","glibc","binutils","objdump","dependencies"],"backgroundTag":null,"analyzedSha":"1136503c6a231a16dce8f921f6fadb63d181e8db","analyzedAt":"2026-08-12T23:15:58.167Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}