从标题读取sh_name每次都会返回一个值

时间:2019-01-30 03:10:55

标签: c linux header elf

无论何时调用isstatic32,即使程序是动态编译的,它也将返回STATIC。我不知道该怎么做。我尝试过每次从sh_name检测到.dynamic时,都会将1加到变量中,如果该变量> 1,它将返回dynamic,但这是行不通的。 (不会让我在这里发布代码)

    #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 :(得分:0)

  

程序是动态编译的

程序不能被动态编译(或者说,“动态编译”意味着完全不同)。您的意思是该程序是动态链接的

猜测:您是在64位模式下编译代码的(因为您使用的是默认为64位模式的64位系统)。

此:

Elf32_Ehdr elf_header;
如果试图确定64位可执行文件是否静态链接,则

使用的类型错误。

P.S。您的程序中还有许多其他错误。

P.P.S。是否存在.dynamic不是确定二进制文件是静态链接还是动态链接的正确方法(不是必需的节,可以将其完全剥离)。您应该改为寻找PT_DYNAMIC程序标头。

P.P.P.S。您应该学习how to debug small programs