cos_gpu_driver_builder: fix compilation with kernel v6.1

1. compile without -Werror=strict-prototypes (backport go/cos-rev/41196)
2. explicitly install binutils to get nm (to avoid
   scripts/check-export-error: nm failed)

BUG=b/267382645
TEST=Compile 470/525 drivers on ToT
RELEASE_NOTE=None

Change-Id: I9f253f32af886ee159ce4606f759e31d8d160ab1
Reviewed-on: https://cos-review.googlesource.com/c/cos/tools/+/46469
Cloud-Build: GCB Service account <228075978874@cloudbuild.gserviceaccount.com>
Reviewed-by: Robert Kolchmeyer <rkolchmeyer@google.com>
Tested-by: Arnav Kansal <rnv@google.com>
Reviewed-by: Meena Shanmugam <meenashanmugam@google.com>
diff --git a/src/cmd/cos_gpu_driver_builder/Dockerfile b/src/cmd/cos_gpu_driver_builder/Dockerfile
index a456632..69a0553 100644
--- a/src/cmd/cos_gpu_driver_builder/Dockerfile
+++ b/src/cmd/cos_gpu_driver_builder/Dockerfile
@@ -7,5 +7,5 @@
 FROM ubuntu:latest
 LABEL maintainer="cos-containers@google.com"
 COPY --from=go-builder /work/src/cmd/cos_gpu_driver_builder/cos-gpu-driver-builder /cos-gpu-driver-builder
-RUN apt-get update && apt-get -y install ca-certificates xz-utils kmod make libc-dev libc6-dev libelf-dev
+RUN apt-get update && apt-get -y install ca-certificates xz-utils kmod make libc-dev libc6-dev libelf-dev binutils
 ENTRYPOINT ["/cos-gpu-driver-builder"]
diff --git a/src/cmd/cos_gpu_driver_builder/internal/builder/builder.go b/src/cmd/cos_gpu_driver_builder/internal/builder/builder.go
index 3cf14e0..5a2f2a3 100644
--- a/src/cmd/cos_gpu_driver_builder/internal/builder/builder.go
+++ b/src/cmd/cos_gpu_driver_builder/internal/builder/builder.go
@@ -61,6 +61,15 @@
 	if err = cos.ForceSymlinkLinker(filepath.Join(dirName, linkerLocation)); err != nil {
 		return "", "", fmt.Errorf("failed to create symlink to COS linker: %v", err)
 	}
+	cc := os.Getenv("CC")
+	if cc == "" {
+		return "", "", fmt.Errorf("failed to find CC in env")
+	} else {
+		// create a wrapper removing -Werror=strict-prototypes from the CC command line.
+		if err = cos.AddCCWrapperToPath(dirName, dirName, cc); err != nil {
+			return "", "", fmt.Errorf("failed to create CC wrapper: %v", err)
+		}
+	}
 	// run NVIDIA driver package
 	if err = os.Chmod(filepath.Join(dirName, nvidiaInstaller), defaultFilePermission); err != nil {
 		return "", "", err
diff --git a/src/cmd/cos_gpu_driver_builder/main.go b/src/cmd/cos_gpu_driver_builder/main.go
index fdc93d3..9801ea2 100644
--- a/src/cmd/cos_gpu_driver_builder/main.go
+++ b/src/cmd/cos_gpu_driver_builder/main.go
@@ -23,7 +23,8 @@
 
 func main() {
 	flag.Parse()
-
+	// always run driver builder with verbose logging.
+	flag.Set("v", "2")
 	if *bucket == "" && *configDir == "" {
 		log.Fatal("empty watcher gcs dir and config file dir")
 	}
diff --git a/src/pkg/cos/cos.go b/src/pkg/cos/cos.go
index 68b1517..c07ca41 100644
--- a/src/pkg/cos/cos.go
+++ b/src/pkg/cos/cos.go
@@ -258,3 +258,25 @@
 func symlinkLinker(symlinkPath string) error {
 	return os.Symlink("x86_64-cros-linux-gnu-ld", symlinkPath)
 }
+
+// Creates a CC wrapper and adds it to the env PATH. Newer versions of LLVM have
+// different -Wstrict-prototypes behavior that impacts the nvidia installer. The
+// kernel always uses -Werror=strict-prototypes by default. This wrapper removes
+// -Werror=strict-prototypes from the CC command line.
+func AddCCWrapperToPath(toolchainDir, workDir, cc string) error {
+	wrapper := `#!/bin/bash
+for arg; do
+  shift
+  if [[ "${arg}" == "-Werror=strict-prototypes" ]]; then continue; fi
+  set -- "$@" "${arg}"
+done
+`
+	wrapper += fmt.Sprintf("exec %s/bin/%s $@", toolchainDir, cc)
+	if err := os.WriteFile(filepath.Join(workDir, cc), []byte(wrapper), 0755); err != nil {
+		return err
+	}
+	log.V(2).Info("Creating a CC wrapper removing -Werror=strict-prototypes from the CC command line.")
+	log.V(2).Info(wrapper)
+	os.Setenv("PATH", fmt.Sprintf("%s:%s", workDir, os.Getenv("PATH")))
+	return nil
+}