«информационные функции» дают много нежелательных имен функций, которых нет в моем двоичном файле в GDB

#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 параметрами командной строки. Он удалит все неиспользуемые данные, код и данные из исполняемого файла. Тогда в вашем коде будут только используемые функции.