这是我的问题: 我创建了一个链接器脚本,将我的代码划分到不同的区域。 这是链接器脚本:
OUTPUT_ARCH(arm)
SECTIONS {
. = 0x400000;
.stack1 : {
__stack_start1 = . ;
}
. = 0x800000;
.stack2 : {
__stack_start2 = . ;
}
. = 0x19900000;
.vectors1 : {
*(.resetvector1)
}
. = 0x19900018;
.irq_vector : {
*(.irqvector)
}
. = 0x19908000;
.init : { /* Init code and data */
*(.text1.init)
*(.text2.init)
}
/DISCARD/ : { /* Exit code and data */
*(.text.exit)
*(.data.exit)
*(.exitcall.exit)
}
.text : { /* Real text segment */
_text = .; /* Text and read-only data*/
*(.text)
_etext = .; /* End of text section */
}
. = ALIGN(8192);
.data : {
/*
* first, the init task union, aligned
* to an 8192 byte boundary.
*/
*(.init.task)
/*
* then the cacheline aligned data
*/
. = ALIGN(32);
*(.data.cacheline_aligned)
/*
* and the usual data section
*/
*(.data)
CONSTRUCTORS
_edata = .;
}
.bss : {
__bss_start = .; /* BSS */
*(.bss)
*(COMMON)
_end = . ;
}
. = ALIGN(8192);
_end_kernel = . ;
.vectors2 : {
*(.resetvector2)
}
}
它工作正常但是当整个程序大约几kb时输出文件大约是450Mb !! 为什么?? 我认为ld填充(带有0x0)我的堆栈,数据,文本等区域之间的空区域。 如何避免这个问题?
提前致谢。
答案 0 :(得分:1)
我尝试使用 .sectionname location 语法而不是。 = location .section 。如果这没有帮助,用MEMORY定义单独的内存区域并使部分去那里应该肯定会阻止这种行为。