Чтение sh_name из заголовка будет возвращать одно значение каждый раз - PullRequest
0 голосов
/ 30 января 2019

Каждый раз, когда вызывается isstatic32, он возвращает STATIC, даже если программа динамически компилируется.Я понятия не имею, что делать.Я пробовал каждый раз, когда он обнаруживает .dynamic из sh_name, он добавляет 1 к переменной и, если переменная> 1, он возвращает динамический, но это не сработало.(не дайте мне написать здесь код)

    #include <stdio.h>
#include <elf.h>
#define DYNAMIC 1
#define STATIC 2        



static int isstatic32(FILE* fd, Elf32_Ehdr eh, Elf32_Shdr sh_table[])
{
static int i;
static int kek = 0;
static char* sh_str;
static char* buff;

buff = malloc(sh_table[eh.e_shstrndx].sh_size);

if(buff != NULL)
{
    fseek(fd, sh_table[eh.e_shstrndx].sh_offset, SEEK_SET);
    fread(buff, 1, sh_table[eh.e_shstrndx].sh_size, fd);
}
sh_str = buff;

for(i=0; i<eh.e_shnum; i++)
{
    printf("%d", i);
    if(!strcmp(".dynamic", (sh_str + sh_table[i].sh_name)))
    {
        return DYNAMIC;
    }
}

return STATIC;

}


int main()
{

                FILE *fp = NULL;
                char* f;
                f = "/proc/self/exe";                   
                Elf32_Ehdr elf_header;
                Elf32_Shdr* sh_table;
                fp = fopen(f, "r");

                fseek(fp, 0, SEEK_SET);
                fread(&elf_header, 1, sizeof(Elf32_Ehdr), fp);
                sh_table = malloc(elf_header.e_shentsize*elf_header.e_shnum);
                fseek(fp, elf_header.e_shoff, SEEK_SET);
                fread(sh_table, 1, elf_header.e_shentsize*elf_header.e_shnum, fp);
                if(isstatic32(fp, elf_header, sh_table) == STATIC)
                {

                    printf("statically linked");

                }
                                    else
                {
                    printf("dynamic");
                }
                fp = NULL;
                f = NULL;



}

1 Ответ

0 голосов
/ 02 февраля 2019

программа динамически компилируется

Программа не может динамически компилироваться (точнее, «динамически компилируемая» означает нечто совершенно иное).Вы имеете в виду, что программа динамически связана .

Дикая догадка: вы скомпилировали свой код в 64-битном режиме (потому что вы работаете в 64-битной системе, по умолчанию 64-битовый режим).

Это:

Elf32_Ehdr elf_header;

- неправильный тип для использования, если вы пытаетесь определить, является ли 64-битный исполняемый файл статически связанным или нет.

PS В вашей программе также есть много других ошибок.

PPS Наличие или отсутствие .dynamic - это не правильный способ определить, был ли двоичный файл статически или динамически связан (разделы не 'т, и может быть полностью удален).Вместо этого вы должны искать PT_DYNAMIC заголовок программы.

PPPS Вы должны научиться , как отлаживать небольшие программы .

...