Cualquiera tiene una referencia para la representación de va_list
en x86_64 ABI (la utilizada en Linux)? Estoy tratando de depurar un poco de código en la pila o argumentos parecen corrupto y que sería de gran ayuda para entender lo que estoy supone a estar viendo ...¿Cuál es el formato de la estructura va_list x86_64?
Respuesta
hice mi comentario en una respuesta.
This may help. Es una referencia, aunque ligera.
la referencia de lista de argumentos variable comienza en la página 50, luego continúa, página 52-53 documentos va_list
:
El Tipo va_list
El tipo va_list es una matriz que contiene un único elemento de una estructura que contiene la información necesaria para implementar la macro va_arg . La definición C de fi de va_list tipo se da en la fi gura 3,34
// Figure 3.34
typedef struct {
unsigned int gp_offset;
unsigned int fp_offset;
void *overflow_arg_area;
void *reg_save_area;
} va_list[1];
El va_start Macro
La macro va_start inicializa la estructura como sigue:
reg_save_area
Los puntos elemento a el inicio del área de guardar registro.
overflow_arg_area
Este puntero se utiliza para recuperar argumentos pasados en la pila . Se inicializa con la dirección del primer argumento pasado en la pila, si existe, y luego siempre actualizada para apuntar al inicio del siguiente argumento en la pila.
gp_offset
El elemento tiene el desplazamiento en bytes desde reg_save_area al lugar donde se guarda el siguiente registro general argumento finalidad disponible. En caso todos los registros de argumento han sido agotado, se establece en el valor 48 (6 * 8).
fp_offset
El elemento tiene el desplazamiento en bytes desde reg_save_area al lugar donde se guarda la siguiente disposición flotante punto de registro de argumentos. En caso todos los registros de argumento han sido agotado, se establece en el valor 304 (6 * 8 + 16 * 16).
Gracias. Estoy aceptando esto y también estoy explicando el problema y cómo lo resolví como otra respuesta. –
@R ..: Me alegra ayudar. – Skurmedel
Estoy bastante seguro de que estos registros de "coma flotante" son realmente registros SSE, y que solo hay 8 de ellos. –
Resulta que el problema fue que gcc hizo va_list
un tipo de matriz.Mi función era la de la firma:
void foo(va_list ap);
y quería pasar un puntero a ap
a otra función, por lo que hizo:
void foo(va_list ap)
{
bar(&ap);
}
Por desgracia, los tipos de matriz descomposición de los tipos de puntero en las listas de argumentos de funciones , entonces, en lugar de pasar un puntero a la estructura original, estaba pasando un puntero a un puntero.
Para evitar el problema, he cambiado el código para:
void foo(va_list ap)
{
va_list ap2;
va_copy(ap2, ap);
bar(&ap2);
va_end(ap2);
}
Ésta es la única solución portátil que podía llegar a, que tenga en cuenta tanto la posibilidad de que va_list
es un tipo de matriz y la posibilidad eso no es
¿No podría haber hecho 'foo' tomar un argumento de tipo' va_list * '? – caf
@caf: 'foo' tiene una firma fija que no puedo cambiar. E incluso si no, las funciones 'v *' siempre toman un argumento 'va_list', no un argumento' va_list * '. Esta es una convención estándar y sería molesto para los usuarios de la función violarla. –
¿Por qué necesitó pasar un puntero a ap2 en la llamada a bar()? – ydroneaud
- 1. ¿Cómo obtengo un NSString formateado de formato y va_list?
- 2. Pase va_list o puntero a va_list?
- 3. ¿Cuál es el propósito de la estructura flags en iOS?
- 4. ¿Es seguro volver a va_list en C?
- 5. ¿Es syscall una instrucción en x86_64?
- 6. ¿Cuál es la diferencia entre el formato OMF y COFF?
- 7. ¿Cuál es la estructura de memoria de cvMat de OpenCV?
- 8. ¿Cuál es la mejor estructura de datos para autocompletar texto?
- 9. Java - ¿Cuál es la mejor estructura de implementación para Graph?
- 10. ¿Cuál es la mejor estructura de solución MVC3?
- 11. ¿cuál es la diferencia entre la estructura estática y la estructura normal?
- 12. Crear va_list dinámicamente
- 13. va_list no ha sido declarado
- 14. va_list falsa en ARC
- 15. ¿Cuál es el formato de salida de SHA256
- 16. ¿Cuál es el formato de salida de xmllint ls?
- 17. ¿Cuál es el formato del archivo de ilustraciones de iTunes?
- 18. ¿Cuál es el formato de cadena del Asp.net SessionID?
- 19. ¿Cuál es el formato correcto para pubdate de feed RSS?
- 20. ¿Cuál es la estructura de respuesta exacta para el código de estado HTTP 300 (opciones múltiples)?
- 21. ¿Cuál es el formato (esquema) de los archivos .NET PDB?
- 22. ¿Cuál es el formato aceptado por el analizador System.Net.Mail.MailAddress?
- 23. Paquete Java Vs Carpeta-Estructura? cuál es la diferencia
- 24. cuál es la estructura interna correcta del archivo JAR
- 25. ¿Cuál es la mejor estructura para un proyecto Android SVN?
- 26. ¿Cuál es la diferencia entre declarar y definir una estructura?
- 27. ¿Cuál es la convención sobre la estructura de URL en el patrón MVC/HMVC/PAC?
- 28. ¿Cuál es el formato del archivo XML Remap para IKVM?
- 29. ¿Cuál es su estructura de directorio de desarrollo de software?
- 30. ¿Cuál es la diferencia en contactos versus contactos sin formato?
Para el que se acerca: ¿qué estás pensando? No está fuera de tema; ¡se trata de programar en Linux! –