A função de 64 bits retorna o ponteiro de 32 bits

Essa função está enterrada em um ninho complexo; portanto, encontrar a causa provavelmente está além de qualquer coisa que eu possa perguntar, mas estou me perguntando se alguém poderá dar algumas dicas sobre como eu posso depurar isso. Aqui está a essência do código com o qual estou tendo problemas

//func1.c
somestruct* func1(somestruct* mystruct)
{
    printf("func1: %p, %i\n", mystruct, mystruct->foo);
    return mystruct;
}
//func2.c
somestruct* func1(somestruct* mystruct);
void func2()
{
    somestruct *mystruct = malloc(sizeof(somestruct));
    mystruct->foo = 10;
    printf("func2: %p, %i\n", mystruct, mystruct->foo);
    mystruct = func1(mystruct);
    printf("back in func2: %p\n", mystruct);
    free(mystruct);
}

E eu chamo func2. A saída é assim

func2: 0x7f38a00008c0, 10
func1: 0x7f38a00008c0, 10
back in func2: 0xffffffffa00008c0
(SEGFAULT trying to free 0xffffffffa00008c0)

O código real é mais complexo, "mystruct" é distribuído em muitos outros lugares também sem problemas, o fato de as funções estarem em arquivos diferentes parece que isso pode fazer parte do problema; sim, ele precisa retornar o ponteiro (o não é garantido que o ponteiro retornado seja o mesmo que o ponteiro de entrada). Parece-me realmente estranho que seja meio truncado (mas não realmente) para 32 bits e depois preenchido com ffffffff no topo.

Quando compilado em uma máquina de 32 bits, funciona exatamente como deveria.

Eu tinha considerado corrupção de memória em algum lugar, então eu a executei através do valgrind. O Valgrind não reporta erros e, na verdade, faz com que seja concluído com êxito. Textbook heisenbug. Pelo menos eu posso usar o GDB.

Alguém tem alguma idéia do que pode estar causando isso, ou pelo menos como eu posso começar a rastrear o problema?

questionAnswers(1)

yourAnswerToTheQuestion