未定义对'的引用;printf';在C程序中

未定义对'的引用;printf';在C程序中,c,gcc,linker,ld,C,Gcc,Linker,Ld,我试图理解一些gcc特性,比如\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 我的设置 对齐.c 不可能的 问题 每当我尝试链接时,它都会因未定义的引用而失败 dudarev@Test-Sandbox section $ gcc -c align.c -o align.o dudarev@Test-Sandbox

我试图理解一些
gcc
特性,比如
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

我的设置

对齐.c 不可能的 问题 每当我尝试链接时,它都会因未定义的引用而失败

dudarev@Test-Sandbox section $ gcc -c align.c -o align.o
dudarev@Test-Sandbox section $ gcc -c -I include/ imposible.c -o imposible.o
imposible.c: In function ‘imposible’:
imposible.c:6:9: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
  return (int) &base;
     ^

dudarev@Test-Sandbox section $ ld -T ld.lds align.o imposible.o -o a.out
align.o: In function `main':
align.c:(.text+0x27): undefined reference to `printf'
align.c:(.text+0x3b): undefined reference to `printf'
align.c:(.text+0x4f): undefined reference to `printf'
align.c:(.text+0x65): undefined reference to `printf'
align.c:(.text+0x79): undefined reference to `printf'
align.o:align.c:(.text+0x8d): more undefined references to `printf' follow
据我所知,它没有找到
printf
,这意味着
stdio
没有链接。 我在堆栈溢出问题之后安装了
glibc static
,并尝试了
-lc
开关和
ld
,结果是

dudarev@Test-Sandbox section $ ld -lc -T ld.lds align.o imposible.o -o a.out
ld: cannot find -lc
我在想念什么人


关于此问题,请提前感谢

不可能。c:6:9:警告:从指针转换为不同大小的整数[-Wpointer到int cast] 返回值(整数)和基数

这是因为“base”的类型是:
long int
,而
impossible()
函数的返回类型是:
int

文件
align.c
会导致编译器输出大量警告,所有这些警告都应该更正

文件:
ld.lds
缺少几个必需的语句

ld.lds
中缺少的语句是无法找到
printf()
函数的原因

下面是
align.c
文件的更正版本

#include <stdio.h>

//Align some ints
#define BYTES 16

#define weird_thing __attribute__((__section__("weird.data")))
int weird_thing *bootstrap;

int a __attribute__((aligned(BYTES))) = 1;
int b __attribute__((aligned(BYTES))) = 2;
int c = 3;
int d __attribute__((aligned(BYTES))) = 4;


int main( void )
{
        extern int a;
        extern int b;
        extern int c;
        extern int d;
        int *p = &a;
        printf(" a = %p \n", (void*)&a);
        printf(" sizof(a) = %lu\n", sizeof(a));
        printf("__alignof__ = %lu\n", __alignof__(a));
        printf(" p = %p \n\n", p);

        printf(" b = %p \n", &b);
        printf(" sizof(b) = %lu\n", sizeof(b));
        printf("__alignof__ = %lu\n", __alignof__(b));
        p = p + (BYTES / sizeof(int));
        printf(" p = %p \n\n", p);

        printf(" c = %p \n", &c);
        printf(" sizof(c) = %lu\n", sizeof(c));
        printf("__alignof__ = %lu\n", __alignof__(c));
        p = p + sizeof(b) / sizeof(int) ;
        printf(" p = %p \n\n", p);

        long unsigned int alignment;
        for( ;
             (alignment = (long unsigned int) p) &
             ((BYTES << 1 )- 1) && alignment != 0 ;
             p++)
        {
             printf("alignment = %p\n", (void*)alignment);
        }

        printf(" d = %p \n", &d);
        printf(" sizof(d) = %lu\n", sizeof(d));
        printf("__alignof__ = %lu\n", __alignof__(d));
        printf(" p = %p \n\n", p);
}
a = 0x602070 
 sizof(a) = 4
__alignof__ = 16
 p = 0x602070 

 b = 0x602080 
 sizof(b) = 4
__alignof__ = 16
 p = 0x602080 

 c = 0x602084 
 sizof(c) = 4
__alignof__ = 4
 p = 0x602084 

alignment = 0x602084
alignment = 0x602088
alignment = 0x60208c
alignment = 0x602090
alignment = 0x602094
alignment = 0x602098
alignment = 0x60209c
 d = 0x602090 
 sizof(d) = 4
__alignof__ = 16
 p = 0x6020a0 

注意:
align.c
文件具有
main()
函数,该函数不调用任何其他已发布的函数,例如
impossible()

尝试在同一文件(而不是ld)上使用verbose标志
-v
运行gcc,并查看传递给
ld
的所有标志(或
collect2
)。也不相关,但
return(int)和base。为什么?@AjayBrahmakshatriya,这里是输出@AjayBrahmakshatriya,对于不相关的,如上所述,我正在学习,我正在尝试使用base检索节指针地址。你怎么会认为将指针投射到
int
会得到节指针(不管是什么)?请指出链接器脚本中缺少哪些必要语句,以及为什么需要这些语句才能访问printf?@Ruso_x,.lds文件必须包含“独立”的库,并且包含“printf()”函数的实现
dudarev@Test-Sandbox section $ gcc -c align.c -o align.o
dudarev@Test-Sandbox section $ gcc -c -I include/ imposible.c -o imposible.o
imposible.c: In function ‘imposible’:
imposible.c:6:9: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
  return (int) &base;
     ^

dudarev@Test-Sandbox section $ ld -T ld.lds align.o imposible.o -o a.out
align.o: In function `main':
align.c:(.text+0x27): undefined reference to `printf'
align.c:(.text+0x3b): undefined reference to `printf'
align.c:(.text+0x4f): undefined reference to `printf'
align.c:(.text+0x65): undefined reference to `printf'
align.c:(.text+0x79): undefined reference to `printf'
align.o:align.c:(.text+0x8d): more undefined references to `printf' follow
dudarev@Test-Sandbox section $ ld -lc -T ld.lds align.o imposible.o -o a.out
ld: cannot find -lc
#include <stdio.h>

//Align some ints
#define BYTES 16

#define weird_thing __attribute__((__section__("weird.data")))
int weird_thing *bootstrap;

int a __attribute__((aligned(BYTES))) = 1;
int b __attribute__((aligned(BYTES))) = 2;
int c = 3;
int d __attribute__((aligned(BYTES))) = 4;


int main( void )
{
        extern int a;
        extern int b;
        extern int c;
        extern int d;
        int *p = &a;
        printf(" a = %p \n", (void*)&a);
        printf(" sizof(a) = %lu\n", sizeof(a));
        printf("__alignof__ = %lu\n", __alignof__(a));
        printf(" p = %p \n\n", p);

        printf(" b = %p \n", &b);
        printf(" sizof(b) = %lu\n", sizeof(b));
        printf("__alignof__ = %lu\n", __alignof__(b));
        p = p + (BYTES / sizeof(int));
        printf(" p = %p \n\n", p);

        printf(" c = %p \n", &c);
        printf(" sizof(c) = %lu\n", sizeof(c));
        printf("__alignof__ = %lu\n", __alignof__(c));
        p = p + sizeof(b) / sizeof(int) ;
        printf(" p = %p \n\n", p);

        long unsigned int alignment;
        for( ;
             (alignment = (long unsigned int) p) &
             ((BYTES << 1 )- 1) && alignment != 0 ;
             p++)
        {
             printf("alignment = %p\n", (void*)alignment);
        }

        printf(" d = %p \n", &d);
        printf(" sizof(d) = %lu\n", sizeof(d));
        printf("__alignof__ = %lu\n", __alignof__(d));
        printf(" p = %p \n\n", p);
}
a = 0x602070 
 sizof(a) = 4
__alignof__ = 16
 p = 0x602070 

 b = 0x602080 
 sizof(b) = 4
__alignof__ = 16
 p = 0x602080 

 c = 0x602084 
 sizof(c) = 4
__alignof__ = 4
 p = 0x602084 

alignment = 0x602084
alignment = 0x602088
alignment = 0x60208c
alignment = 0x602090
alignment = 0x602094
alignment = 0x602098
alignment = 0x60209c
 d = 0x602090 
 sizof(d) = 4
__alignof__ = 16
 p = 0x6020a0