急问:用gcc编译源码后,输出的.pdr段里放的是什么东西?

我将自己的源代码用makefile文件编译连接时 

当连接的时候,报 
Not enough room for program header 
的错误,不知道是什么意思 

我的代码编译时使用了长跳转编译,将代码分别方在两块分离的地址上 


如果把代码放在连续的地址上,编译可以通过
用objdump命令看了一下,发现有一个段叫:

.pdr

看了ld文档后,发现.pdr段和program header有关系,
不知道该怎么处理这个段?
不再报
Not enough room for program header 
的错误。


多谢各位大虾指点!

作者: elfcandy   发布时间: 2007-08-30

贴makefile.

作者: dai_weitao   发布时间: 2007-08-30

就是使用长跳转选项编译后,将代码放在两块地址距离较远的空间上。
进行连接。

现在已经确定,是代码的问题,但是不知道怎样编写代码,才会在cygwin的GNU编译器下采用上述方法编译代码时出现错误。

有没有两个不同数据类型的变量,不做强制转换,直接赋值造成?

谢谢。

另外,我查看了LD手册, program header 与phdr有关,好像有一个段叫.pdr,是用来存放program header。但是手册上也讲了,
program header可以由系统默认设置。

是不是要改段.pdr的设置???


作者: elfcandy   发布时间: 2007-09-03

to:dai_weitao 

我两个帖子是一个问题。
多谢指点了,呵呵。

作者: elfcandy   发布时间: 2007-09-03

我用readelf没有在x86的elf文件中找到pdr段,但是在linux kernel for mips上有这个段,
configure.in中把MIPS_STABS_ELF去掉就可以解决。

作者: hifrog   发布时间: 2007-09-03

请问configure.in是一个文件吗?

我现在在连接选项中增加-N后,可以连接通过。能给出-N连接选项一个比较好理解的解释吗?

我看过LD的说明文档,上面说加上-N后,会取消数据段的页对齐,数据段页对齐是什么意思?

谢谢

作者: elfcandy   发布时间: 2007-09-04

.pdr 是procedure的缩写,.pdr存在于可重定位文件中,一般好像又来存放你当前这个可重定位文件包含的函数的相关数据。现在gcc编译出来的i386体系结构的可重定位文件里面好像没有.pdr这个section。我只知道在gcc-mips的编译出来的mips体系结构可重定位文件里面有这个section,这个sectione好象是从mips的ecoff文件格式中保留下来的,貌似是debug用的。elf标准里面这个.pdr不是系统保留的sectoin。

作者: ddddawzy   发布时间: 2011-05-16

刚上网去搜了一下 .pdr 之存在于mips体系结构的elf文件里面。以前mips使用ecoff的时候,有一个section叫做.mdebug用来存放debug信息的。后来,mips使用elf文件格式的时候,.pdr就用来代替.mdebug的功能了。假如说你的这个可重定位文件中包含三个子程序,那么.pdr包含三个相应的数据项,每个数据项占32个字节。

作者: ddddawzy   发布时间: 2011-05-16