Cuando Linux vea el desmontaje de funciones de un programa C, ¿se mostrará el nombre de la función?
Este es un tema complejo. Depende de si su binario contiene esta información. Esto depende de si la opción de compilación incluye -s. La opción -s elimina los nombres de símbolos no deseados.
Las distribuciones binarias oficiales pueden no contener esta información. Para enlaces estáticos, el lenguaje C/C no requiere nombres de funciones durante la ejecución y utiliza direcciones de memoria para acceder a la memoria, los datos y el código. El nombre de la función se utilizará durante el proceso de compilación y el proceso de vinculación. Para enlaces dinámicos, ld.so se vincula dinámicamente a funciones específicas en algunas bibliotecas a través de nombres de variables durante la ejecución del programa. Los nombres de símbolos vinculados dinámicamente no se pueden eliminar.
La conclusión es que el programa binario mostrará el nombre de la variable si está incluido.
Ejemplo
main.c: int?aaa=10;
int?myfunc(){
return?5;
}
int?main(){
int?bbb=20;
aaa= 20;
bbb=myfunc();
return?0;
}gcc?nostdlib?main.c?-o?main_with_symbols
gcc?-nostdlib? main.c?-o?main_with_symbols
gcc?-nostdlib?main.c?-o?with_symbols
Generar archivos ejecutables con nombres firmados y sin firmar respectivamente. !122?~/src/c_cpp??objdump?-d?main_with_symbols|grep?myfunc
000000000040017c?lt;myfuncgt;: 4001a5:e8?d2?ff?ffcallq?40017c?lt;myfuncgt;
!123?~/src/c_cpp??objdump?d?main_ without_symbols|grep?myfunc
!124?~/src/c_cpp?1?
Obviamente, con la opción -s, muchos símbolos no se utilizan. Obviamente, al usar la opción -s se perderá mucha información de los símbolos y el desmontaje no incluirá los nombres de los símbolos relevantes.