¿Cómo resuelvo un error de compilación de "conflicto de tipo de sección" y las mejores prácticas para usar el atributo de sección con gcc?

Estoy usando Android NDKr8 y, por extensión, gcc para compilar un código de biblioteca que se comparte en varias plataformas, incluidas algunas integradas. Este código usa segmentos para poner un montón de elementos en un espacio de memoria contiguo. La compilación está generando un "error: variable_name provoca un conflicto de tipo de sección".

Usamos una macro para declarar el atributo del segmento:

# define DB_SEGMENT __attribute__ ((__section__ ("DBSegment")))

El nombre_variable anterior se declara de la siguiente manera:

dbStruct const variable_name[] DB_SEGMENT = {
    {conststringvalue0, sizeof(conststringvalue0)},
    …more like this
};

dbStruct es

typedef struct dbStruct
{
    const char * const  address;
    const UINT16        stringSize;
} dbStruct;

conststringvalue0 se declara así:

const char conststringvalue0[] DB_SEGMENT = "some string value";

Este mismo código compila en Xcode utilizando su compilador predeterminado con solo una pequeña modificación en la declaración de la macro DB_SEGMENT. Esta es una C más profunda de lo que estoy acostumbrado, por lo que agradecería cualquier ayuda. Google tiene algunas referencias al error, pero la solución no está clara. ¿Existe una estrategia mejor para configurar una sección de memoria contigua específica?

En respuesta a un comentario, aquí está la única diferencia con la versión compilada correctamente en XCode:

#define DB_SEGMENT __attribute__ ((section ("DBSegment,DBSection")))

preguntado el 03 de mayo de 12 a las 18:05

¿Cuál es el beneficio de ir a todo este esfuerzo? ¿Por qué no dejar simplemente que el compilador organice el diseño de la memoria? -

Estoy intentando usar una base de código existente que originalmente estaba destinada a dispositivos integrados y usé este método para crear una base de datos en memoria. Es un requisito del proyecto incluir la funcionalidad que usa esto en la base de datos de memoria y no es una opción volver a implementar la lógica que hace uso de ella. -

¿Qué tienes que cambiar en la versión XCode? ¿Y a qué tipo de dispositivos integrados se dirigía esta base de código, los procesadores ARM? -

El puerto se realizó originalmente para XCode y la única diferencia en este punto es que #define para DB_SEGMENT usa una sintaxis diferente para gcc. La versión de XCode se ve así: #define DB_SEGMENT atributo ((sección ("Segmento DB, Sección DB"))). Esta sintaxis no se compila con gcc. Sinceramente, no sé cuál es el tipo de procesador para los dispositivos integrados. Voy a averiguar. -

2 Respuestas

Tengo el mismo problema. Y mi situación es que pongo el código y las variables en la misma sección. Después de poner la variable en una sección diferente, el problema se descartó. Espero que esto ayude.

respondido 27 nov., 13:10

¿Significa eso que no puede poner múltiples variables en la misma sección incluso si la sección tiene suficiente espacio para más de una variable? - ZeZNiQ

"# definir DB_SEGMENT atributo ((. ("Segmento DB")))"

Veo un espacio entre # y define lo que no es correcto.

Elimina ese espacio e intenta compilar.

Respondido 29 Abr '19, 14:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.