Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Неинициализированный глобальный массивСчитайте, что в моём комментарии так и написано. Это что-то меняет?
Потому что тут важен результат, а не способ его получения.Ладно, похоже вы не поняли суть статьи.
при запуске подсовываете другую, с измененным APIТак это, по-вашему, undefined behavior, и может случиться всё, что угодно, или ситуация регулируется стандартом и нам поможет чтение «доки»?
Маленькое дополнение. Ещё есть ARM. В частности AArch64 примерно после 2011 года появился. Конкретно i386 сейчас уже можно рассматривать как устаревший для большинства задач. Тотже linux дропнул его где-то в 2012 году.
Тотже linux дропнул его где-то в 2012 году.Линукс дропнул поддержку 80386го процессора, а не i386 ABI. Который и сегодня «живее всех живых».
root@Shiva:~$ cat k.c
int arr[4];
root@Shiva:~$ cat k1.c
#include <stdio.h>
extern int arr[];
int main()
{
printf("%p\n", arr);
return 0;
}
root@Shiva:~$ gcc k1.c k.c
root@Shiva:~$ nm --print-size --size-sort --radix=d a.out
0000000002101264 0000000000000001 b completed.7697
0000000000001760 0000000000000002 T __libc_csu_fini
0000000000001776 0000000000000004 R _IO_stdin_used
0000000002101280 0000000000000016 B arr
0000000000001610 0000000000000035 T main
0000000000001344 0000000000000043 T _start
0000000000001648 0000000000000101 T __libc_csu_init
root@Shiva:~$
$ readelf --dyn-syms a.out
Symbol table '.dynsym' contains 12 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
3: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable
5: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.2.5 (2)
6: 0000000000201028 0 NOTYPE GLOBAL DEFAULT 23 _edata
7: 0000000000201048 0 NOTYPE GLOBAL DEFAULT 24 _end
8: 0000000000201030 20 OBJECT GLOBAL DEFAULT 24 external_array
9: 0000000000201028 0 NOTYPE GLOBAL DEFAULT 24 __bss_start
10: 00000000000005c8 0 FUNC GLOBAL DEFAULT 10 _init
11: 0000000000000794 0 FUNC GLOBAL DEFAULT 14 _fini
root@Shiva:~$ gcc k1.c k.c
root@Shiva:~$ readelf --dyn-syms -s a.out|grep arr
33: 0000000000200db8 0 OBJECT LOCAL DEFAULT 19 __frame_dummy_init_array_
39: 0000000000200dc0 0 NOTYPE LOCAL DEFAULT 19 __init_array_end
41: 0000000000200db8 0 NOTYPE LOCAL DEFAULT 19 __init_array_start
60: 0000000000201020 16 OBJECT GLOBAL DEFAULT 24 arr
root@Shiva:~$ strip -s a.out
root@Shiva:~$ readelf --dyn-syms -s a.out|grep arr
root@Shiva:~$
Как размеры массивов C стали частью двоичного интерфейса библиотеки