百问网Linux技术区Linux系统开发 打上内核KGDB补丁,编译报错~

1  /  1  页   1 跳转 查看:373

打上内核KGDB补丁,编译报错~

打上内核KGDB补丁,编译报错~

按照书上的原文,一步一步的给Linux 2.6.22.6内核添加KGDB补丁(kgdb-2_linux_2_6_22_uprev.tar.bz2),但是make uImage报错,编译不过。

出错后,自己也分析了错误原因,但是弄了几个小时,还是未解决。请大家帮忙。

下面的kgbd-serial.c文件是按照书上的内容修改的,我对照了,没有打错代码。


报错如下:

arch/arm/mach-s3c2410/kgdb-serial.c:51: warning: initialization makes integer from pointer without a cast
arch/arm/mach-s3c2410/kgdb-serial.c:51: warning: initialization makes integer from pointer without a cast
arch/arm/mach-s3c2410/kgdb-serial.c:51: warning: initialization makes integer from pointer without a cast
arch/arm/mach-s3c2410/kgdb-serial.c: In function `kgdb_serial_init':
arch/arm/mach-s3c2410/kgdb-serial.c:75: warning: comparison between pointer and integer
arch/arm/mach-s3c2410/kgdb-serial.c:75: warning: passing arg 1 of `__inl' makes integer from pointer without a cast
arch/arm/mach-s3c2410/kgdb-serial.c:76: warning: comparison between pointer and integer
arch/arm/mach-s3c2410/kgdb-serial.c:76: warning: passing arg 2 of `__outl' makes integer from pointer without a cast
arch/arm/mach-s3c2410/kgdb-serial.c:79: warning: comparison between pointer and integer
arch/arm/mach-s3c2410/kgdb-serial.c:79: warning: passing arg 1 of `__inl' makes integer from pointer without a cast
arch/arm/mach-s3c2410/kgdb-serial.c:81: warning: comparison between pointer and integer
arch/arm/mach-s3c2410/kgdb-serial.c:81: warning: passing arg 2 of `__outl' makes integer from pointer without a cast
arch/arm/mach-s3c2410/kgdb-serial.c:89: error: called object is not a function
arch/arm/mach-s3c2410/kgdb-serial.c:92: error: called object is not a function
arch/arm/mach-s3c2410/kgdb-serial.c:95: error: called object is not a function
arch/arm/mach-s3c2410/kgdb-serial.c:98: error: called object is not a function
arch/arm/mach-s3c2410/kgdb-serial.c:101: error: called object is not a function
arch/arm/mach-s3c2410/kgdb-serial.c: In function `kgdb_serial_putchar':
arch/arm/mach-s3c2410/kgdb-serial.c:109: error: called object is not a function
arch/arm/mach-s3c2410/kgdb-serial.c:112: error: called object is not a function
arch/arm/mach-s3c2410/kgdb-serial.c: In function `kgdb_serial_getchar':
arch/arm/mach-s3c2410/kgdb-serial.c:118: error: called object is not a function
arch/arm/mach-s3c2410/kgdb-serial.c:121: error: called object is not a function
arch/arm/mach-s3c2410/kgdb-serial.c: In function `kgdb_serial_init':
arch/arm/mach-s3c2410/kgdb-serial.c:89: warning: statement with no effect
arch/arm/mach-s3c2410/kgdb-serial.c:92: warning: statement with no effect
arch/arm/mach-s3c2410/kgdb-serial.c:95: warning: statement with no effect
arch/arm/mach-s3c2410/kgdb-serial.c:98: warning: statement with no effect
arch/arm/mach-s3c2410/kgdb-serial.c:101: warning: statement with no effect
arch/arm/mach-s3c2410/kgdb-serial.c: In function `kgdb_serial_putchar':
arch/arm/mach-s3c2410/kgdb-serial.c:112: warning: statement with no effect
make[1]: *** [arch/arm/mach-s3c2410/kgdb-serial.o] 错误 1


最后编辑kstyle 最后编辑于 2010-03-05 14:50:14
 

回复:打上内核KGDB补丁,编译报错~

把你的文件上传吧
 

回复: 打上内核KGDB补丁,编译报错~

附件: kgdb-serial.zip (2010-3-10 18:41:17, 1.58 K)
该附件被下载次数 30

 

回复:打上内核KGDB补丁,编译报错~

我细看了一下,缺少一个加号,下行中已经加入。
#define portaddr(port, reg) (port_base[port] + (reg))  <<看到了吗?这里要一个"+"号
对代码的分析如下:
根据c文件中定义:
#define wr_regb(port, reg, val) __raw_writeb(val, portaddr(port, reg))
static u32 port_base[] = {S3C24XX_VA_UART0, S3C24XX_VA_UART1, S3C24XX_VA_UART2};
现在把portaddr(port, reg) 展开
portaddr(port, reg)
=(port_base[port] + (reg)
例如port=0, reg= S3C2410_ULCON=0x0 (实际物理地址0x50000000+0x0)
= (S3C24XX_VA_UART0 + S3C2410_ULCON)
这里的意思基地址+偏移地址。这样的话,再把__raw_writeb(val, portaddr(port, reg))展开就对了:
__raw_writeb(val, portaddr(port, reg))
=__raw_writeb(val, S3C24XX_VA_UART0+S3C2410_ULCON)
这里我们要注意__raw_writel(v,a)是这样定义的(include/asm-arm/io.h):
#define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force  *)(a) = (v))
如果没有这个加号,编译器把宏展开后就得到(仍以上面的地址为例)
wr_regb(port, reg, val)
= __raw_writeb(val, portaddr(port, reg))
=__raw_writeb(val, S3C24XX_VA_UART0  S3C2410_ULCON)
这样与定义不符,编译器看到了一个与已经定义的函数同名,但不同功能的函数。
因此:error: called object is not a function。
这个错误引起的原因往往是:函数定义与系统的函数或变量同名,编译器不知道调用谁或怎么调用。比如你自定义一个MAX宏,但系统GCC中往往已经有了这么个东西。
 
1  /  1  页   1 跳转

地址:广东省深圳市南山区南山大道3003号久商大厦C-1406;邮编:518052;电话:0755-86200561

粤ICP备09041549号, 版权所有 百问网   Sitemap

Powered by Discuz!NT 2.0.1214    Copyright © 2001-2010 Comsenz Inc.
Processed in 0.03125 second(s) , 4 queries.
返顶部