PowerPC64 импортирует переименование - PullRequest
0 голосов
/ 24 апреля 2019

Компиляция файла .c с использованием powerpc64-linux-gnu-gcc дает следующий двоичный файл:

.text:00000000100007F4 # .rename _00000017.plt_call.memcpy__GLIBC_2.3, "_00000017.plt_call.memcpy@@GLIBC_2.3"
.text:00000000100007F4
.text:00000000100007F4 # =============== S U B R O U T I N E =======================================
.text:00000000100007F4
.text:00000000100007F4 # void *00000017_plt_call_memcpy__GLIBC_2_3(void *dest, const void *src, size_t n)
.text:00000000100007F4                         _00000017.plt_call.memcpy__GLIBC_2.3:
.text:00000000100007F4 .set arg_28,  0x28
.text:00000000100007F4
.text:00000000100007F4 std       r2, arg_28(r1)
.text:00000000100007F8 ld        r12, (memcpy_plt - 0x10027F00)(r2) # memcpy
.text:00000000100007FC mtctr     r12
.text:0000000010000800 ld        r2, (qword_10020158 - 0x10027F00)(r2)
.text:0000000010000804 bctr
.text:0000000010000804 # End of function _00000017.plt_call.memcpy__GLIBC_2.3

Я не могу понять, откуда взялся .rename _00000017.plt_call.memcpy__GLIBC_2.3, и почему он переименован из простого memcpy?

Пример кода, который дает этот результат:

int main()
{
    char* buf = (char*)calloc(25, sizeof(char));
    char* buf1 = (char*)calloc(25, sizeof(char));
    memcpy(buf, buf1, 25);
}

1 Ответ

1 голос
/ 24 апреля 2019

Этот материал GLIBC_2.3 вводится во время компоновки (компилятор ничего не знает о вашей версии Glibc).А .rename комментарии в списке - это артефакт IDA.(Содержит ли документация IDA что-нибудь о них?)

Знаки @, которые вы видите, указывают версии символов , @@, обозначающие версию по умолчанию, для которой внешняя (в Glibc, в данном случае) ссылки на этот символ связаны.

Компоновщик поддерживает версии символов при использовании ELF.Версии символов полезны только при использовании общих библиотек.Динамический компоновщик может использовать версии символов для выбора конкретной версии функции при запуске программы, которая могла быть связана с более ранней версией общей библиотеки.

Таким образом, решение относительно того, какой символссылка в вашей программе будет привязана к моменту загрузки ld.so.Может быть, это то, что означает .rename.

С помощью цепочки инструментов GNU решение о привязке может фактически быть отложено до времени выполнения.На моей платформе (x86_64-linux-gnu) memcpy - это IFUNC .Вы можете проверить, так ли это для вас, посмотрев на символы glibc, подобные этому readelf -s /lib/libc.so.6 | grep IFUNC.*memcpy.Тем не менее, в теории IDA не будет знать конечный пункт назначения без запуска кода, так что если здесь, скорее всего, нет ничего интересного.Вы можете протестировать другие функции libc, которые не являются ifuncs, ради более чистого эксперимента.

...