2012-03-04 6 views
12

Estoy usando una lib estática que me da una advertencia al subir mi binario para su revisión por Apple.Eliminando una llamada al método desde dentro de una lib estática (.a) sin recompilar

El método en la lib estática que causa la advertencia (selectores no públicos) nunca lo llamo, su correspondiente .h se borra de mi proj, pero la advertencia aún persiste.

Dado que conozco el nombre del método que causa el problema, ¿hay alguna manera de que abra/edite esto .a y comente/elimine la pieza ofensiva del código y luego utilice el .a modificado en mi proyecto.

No tengo acceso a la fuente .a para recompilarlo, y es muy viejo y el creador del mismo no tiene detalles de contacto para rastrear.

Muchas gracias, -Cake

+2

¿Qué es la biblioteca?¿Qué API privada está usando? –

+1

No se utilizó ninguna API privada. Creó un método llamado urlEncodedString que comparte el mismo nombre que una API privada, por lo que obtiene un falso positivo. El método no está siendo utilizado por la aplicación en absoluto, así que quiero eliminarlo. –

+0

No podrá tocar nada en una biblioteca ya compilada. Elimine todo, busque la fuente y modifíquelo, o arriesgándose a que Apple lo rechace. –

Respuesta

6

Solución rápida y sucia: abra el archivo .a en un editor hexadecimal y cambie todas las instancias del nombre. Deje el nombre de la función la misma longitud para que las compensaciones en el archivo no cambien, simplemente cambie una letra o algo así. Hice una prueba rápida, agregando una función ficticia a un subproyecto que estamos creando como una biblioteca estática y luego ajustando el nombre de la función en el archivo .a (hubo cinco instancias, por lo que vale) y todo fue construido correctamente. No veo ningún motivo por el que no pase el control de App Store después de eso.

Estoy realmente sorprendido de que la función aún estuviera allí en la compilación final, pensé que se suponía que Dead Code Stripping debía limpiar cualquier código no utilizado. Huh.

+0

Si es utilizado internamente por la biblioteca, no se considera "código muerto". –

+1

En mi caso de prueba, hice una nueva función que no se usó en ninguna parte. La eliminación de código muerto se habilitó, pero la función no se eliminó. Asi que. – davehayden

+0

Oooh clevers Me gusta – QED

0

No es necesario hackear los archivos binarios. Simplemente desactive la advertencia de "selectores no utilizados" del compilador: -fno-inusada-selectores.

0

Existen varias soluciones, según su lib y proyecto.

En los valores de creación:

  1. Habilitar "código muerto despojar" si es posible: Si no se utiliza el método (incluso a nivel interno), se borrará el símbolo.

  2. Use "Archivo de símbolos no exportado": Simplemente agregue el símbolo en un archivo y se eliminará del archivo binario. Esto funcionará incluso si el símbolo se usa internamente.

  3. Habilitar "despliegue Postprocessing" y "Producto Vinculado Gaza" con "de Gaza Estilo" ajustado en "Todo símbolo"

  4. (no estoy seguro) Use "Símbolos ocultos por Predeterminado ". Esto está relacionado con la generación del código y no debería afectar el enlace, pero por si acaso todo lo anterior falló ...

Cuestiones relacionadas