Estoy escribiendo un módulo nativo para Node, pero me gustaría eliminar la información de depuración. Estoy usando node-gyp para construir el módulo.

Está haciendo una compilación de lanzamiento, pero aún así, la tabla de símbolos está incluida en el archivo de salida.

Así que necesito eliminarlo con el comando strip Unix después de la compilación. ¿Hay alguna forma de eliminarlo en la propia compilación? especificar algo en el archivo .gyp?

Además, incluso después de eliminar los símbolos de depuración, todavía puedo usar

strings [node-module]

Y enumera los nombres de mis funciones. ¿Es posible eliminarlos también?

Este es el comando que utilizo para construir el módulo nativo:

node-gyp rebuild --target=v8.9.4

Y este es mi binding.gyp:

{
  "targets": [
    {
      "libraries": [
          "/usr/lib/x86_64-linux-gnu/libudev.so",
          "/usr/lib/x86_64-linux-gnu/libboost_regex.so.1.58.0"
      ],
      "target_name": "utils",
      "sources": [ "src/native/utils.cpp" ]
    }
  ]
}

¡Gracias!

3
Lacho Tomov 23 feb. 2018 a las 16:03

2 respuestas

La mejor respuesta

Como probablemente sepa, un módulo nativo de nodo es una biblioteca dinámica. Tú no se puede quitar la tabla de símbolos dinámicos de una biblioteca dinámica porque el La tabla de símbolos dinámicos es necesaria en tiempo de ejecución para vincular dinámicamente la biblioteca. Incluso strip --strip-all no eliminará la tabla de símbolos dinámicos. strip --strip-all o strip --strip-unneeded elimina todo lo que puede eliminar de una biblioteca dinámica. Añadiendo -g0 a las banderas de compilación elimina toda la información de depuración , pero las tablas de símbolos contienen más de información de depuración.

Puedes indicarle al vinculador que haga lo mismo que strip --strip-all en linktime pasándole la opción -s|--strip-all. Para hacer esto, su binding.gyp sería:

{
    "targets": [
    {
        "libraries": [
            "/usr/lib/x86_64-linux-gnu/libudev.so",
            "/usr/lib/x86_64-linux-gnu/libboost_regex.so.1.58.0"
        ],
        "target_name": "utils",
        "ldflags" : [ "-Wl,-s" ],
        "sources": [ "src/native/utils.cpp" ],
    }
  ]
}

El módulo de nodo resultante está tan despojado como puede ser una biblioteca compartida:

$ file ./build/Release/utils.node
./build/Release/utils.node: ELF 64-bit LSB shared object, x86-64, \
version 1 (SYSV), dynamically linked, \
BuildID[sha1]=eb53cee5839c71b41176bc7a852802035009e8ae, stripped
                                                        ^^^^^^^^
2
Mike Kinghan 27 feb. 2018 a las 19:15

He buscado un poco y puede haber una solución de fuerza bruta para especificar el indicador del compilador -g0 manualmente. Eche un vistazo aquí: https://github.com/nodejs/node-gyp/issues / 26. Entonces, siguiendo su ejemplo y los consejos dados en el problema de github, el archivo de entrada debería ser así:

{
  "targets": [
    {
      "libraries": [
          "/usr/lib/x86_64-linux-gnu/libudev.so",
          "/usr/lib/x86_64-linux-gnu/libboost_regex.so.1.58.0"
      ],
      "target_name": "utils",
      "cflags_cc": [ "-g0" ]
      "sources": [ "src/native/utils.cpp" ]
    }
  ]
}

Lamentablemente, no tengo forma de probarlo y no es independiente de la plataforma.

1
bartop 27 feb. 2018 a las 13:13