#c #debugging #gdb
Вопрос:
Вот мой код на языке си
#include <stdlib.h>
#include<stdio.h>
int add(int a,int b){
int sum=0;
sum = a b;
return sum;
}
int sub(int a ,int b){
int sub=0;
sub = a-b;
return sub;
}
int main(int argc, char **argv){
int a = atoi(argv[1]);
int b = atoi(argv[2]);
printf("Sum of %d and %d = %d",a,b,add(a,b));
printf("Sub of %d and %d = %d",a,b,sub(a,b));
}
Я скомпилировал его, дав эту команду
gcc -ggdb calculator.c -o calculator
Затем я открыл в gdb. После установки точки останова в «главном» и попытался перечислить все функции с помощью команды «информационные функции»..Но это дает кучу других огромных функций.Вот некоторые из них;
Все определенные функции:
File ../argp/argp-fmtstream.h:
266: size_t __argp_fmtstream_point(argp_fmtstream_t);
220: int __argp_fmtstream_putc(argp_fmtstream_t, int);
207: int __argp_fmtstream_puts(argp_fmtstream_t, const char *);
230: size_t __argp_fmtstream_set_lmargin(argp_fmtstream_t, size_t);
242: size_t __argp_fmtstream_set_rmargin(argp_fmtstream_t, size_t);
254: size_t __argp_fmtstream_set_wmargin(argp_fmtstream_t, size_t);
194: size_t __argp_fmtstream_write(argp_fmtstream_t, const char *, size_t);
File ../argp/argp.h:
526: void __argp_usage(const struct argp_state *);
544: int __option_is_end(const struct argp_option *);
532: int __option_is_short(const struct argp_option *);
File ../bits/stdlib-bsearch.h:
20: void *__GI_bsearch(const void *, const void *, size_t, size_t, __compar_fn_t);
File ../csu/libc-start.c:
129:
int __libc_start_main(int (*)(int, char **, char **), int, char **, int (*)(int, char
**, char **), void (*)(void), void (*)(void), void *);
File ../elf/dl-runtime.c:
484: void _dl_call_pltexit(struct link_map *, Elf64_Word, const void *, void *);
61: Elf64_Addr _dl_fixup(struct link_map *, Elf64_Word);
154:
Elf64_Addr _dl_profile_fixup(struct link_map *, Elf64_Word, Elf64_Addr, void *, long
*);
И многое другое…Это всего лишь часть 1/100
Комментарии:
1.
printf
написан на языке Си, и в нем есть функции. Так и естьatoi
. Иmain
тоже чем — то вызван.2. Я знаю это @user253751.. Но вопрос в том, почему я получаю так много выходных результатов, в то время как другие-нет?
Ответ №1:
Большинство этих функций поступают из библиотеки glibc, которая во время выполнения связана с каждым динамическим исполняемым файлом.
Вы можете проверить, какие библиотеки связаны, выполнив ldd your-executable-name
, а затем изучить файлы reported .so для функций, которые у них есть (используя gdb таким же образом).
Ответ №2:
Попробуйте связать с -Wl,--gc-sections -ffunction-sections -fdata-sections
параметрами командной строки. Он удалит все неиспользуемые данные, код и данные из исполняемого файла. Тогда в вашем коде будут только используемые функции.