Símbolo de compilación de archivos Android ELF oculto

El sistema de compilación es un sistema muy poderoso con muchos parámetros de compilación, pero la mayoría de las personas solo han escuchado unos pocos, y esperan tener tiempo para mirar los datos relevantes y estudiar con claridad.

Hoy, presentaré cómo ocultar los símbolos cuando se compila bajo el NDK de Android. Por defecto, gcc exporta todos los símbolos. Por razones de seguridad, puede ocultar los símbolos, lo que puede causar grandes problemas de craqueo. Además, puede Al reducir efectivamente el tamaño del archivo so, otra ventaja es que puede acelerar la velocidad de ejecución del programa.

Básicamente, existen varias formas de ocultar símbolos: una es agregar el atributo de visibilidad (__attribute __ ((visibilidad ("oculto")) cuando se define la función; una es agregar -fvisibilidad = opción de compilación oculta en Android.mk; la otra es agregar - Opción de script de versión y compilar script de script de versión.

Sin mencionar los dos primeros, después de agregar y compilar con readelf, puede encontrar que no hay una función que haya definido en la tabla de símbolos.


Hablemos de la tercera opción, el script de versión. El script de versión es un archivo de script escrito por el usuario y puede compilarse directamente en el script de enlace ld. Parece un poco confuso. Para decirlo sin rodeos, el enlazador lo escribirá al vincular. El script de versión se agrega al script de enlace, y el vinculador ejecutará los comandos en el script de versión para implementar algunas funciones.

La función principal del enlazador es realizar el enlace desde el símbolo a la dirección. En este proceso, el enlazador definirá una estructura de árbol, en la que cada nodo (nodo de versión) está compuesto por el nombre del símbolo y la interdependencia definida en el script de versión. La secuencia de comandos de versión puede especificar que un determinado símbolo esté vinculado a un determinado nodo de versión (nodo de versión), de modo que algunos símbolos se puedan establecer en el área local, luego estos símbolos se pueden ocultar desde el exterior del modo.

El formato del script de versión es el siguiente:

VER1 {
	 global:
		 foo1;
	 local:
		 old*; 
		 original*; 
		 new*; 
};
Entre ellos, VER1 es algo así como una función en el script, que también se puede llamar etiqueta. Puede definir varias etiquetas similares a VER2, VER3, etc. Se utilizan para distinguir diferentes símbolos en el compilado, es decir, ciertos símbolos están vinculados a esta etiqueta En.

Global define símbolos que son visibles para el mundo exterior.

local es un símbolo que solo es visible en el interior.

* Y? Son comodines para que coincidan con múltiples y un carácter respectivamente.

De esta manera, puede definir la visibilidad de los símbolos a través de la secuencia de comandos de la versión. No tiene una comprensión completa. Vamos a escribir mucho primero.


Enlace de referencia:

1.http: //man7.org/conf/lca2006/shared_libraries/slide18c.html

2.http: //ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_25.html

3.http: //www.gnu.org/software/gnulib/manual/html_node/LD-Version-Scripts.html

Publicado 60 artículos originales · Me gusta 44 · Visitas 340,000+

Supongo que te gusta

Origin blog.csdn.net/beyond702/article/details/56281068
Recomendado
Clasificación