⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ldscript.c

📁 嵌入式系统基础课件
💻 C
字号:
/* ============================================================ */
/* File: LDSCRIPT.C						*/
/*								*/
/* Copyright (C) 2001, Daniel W. Lewis and Prentice-Hall	*/
/*								*/
/* Purpose: Creates linker script file for use with ld.		*/
/*								*/
/* Modification History:					*/
/*								*/
#define		 BUG_FEB_20_2002
/*	Found by Wayne Gibson (wgibson@speakeasy.net).		*/
/*	Execution of LGDT instruction in real mode still had	*/
/*	default size of 64KB for DS. If data segment contained	*/
/*	more than 64KB, the LGDT instruction would cause an	*/
/*	exception. Solution was to create a new "SECTION .init"	*/
/*	and place Init_CPU and Check_CPU code, as well as the	*/
/*	the gdt and gdt_info data structures. Also required	*/
/*	change to LDSCRIPT and resulting LINK.CMD file.		*/
/*								*/
/* ============================================================ */

#include <stdio.h>
#include <stdarg.h>
#include <string.h>

/* ---------------------------- */
/* Usage: ldscript >linker.cmd	*/
/* ---------------------------- */

char *title[] =
{
"/* ------------------------------------------------------------ */",
"/* Script file for linker ld.  Designed for use on an IBM-PC.   */",
"/* ------------------------------------------------------------ */",
NULL
} ;

char *script[] =
{
"OUTPUT_FORMAT(\"binary\")",
"OUTPUT(\"embedded.bin\")",
"EXTERN(start)",
"ENTRY(start)",
"MEMORY {",
"   /* --------------------------------------------------------- */",
"   /* The loader starts execution of the application at         */",
"   /* physical address zero, so .start must be placed in        */",
"   /* conventional memory, thus '>conventional'. You may put    */",
"   /* one or more of the remaining sections in extended memory  */",
"   /* by replacing their respective '>conventional' directives  */",
"   /* with a '>extended' directive where it appears below. If   */",
"   /* you do, however, the application will not run on a        */",
"   /* machine with no extended memory.                          */",
"   /* --------------------------------------------------------- */",
"   conventional : ORIGIN = 0x00000000, LENGTH = 640*1024",
"       reserved : ORIGIN = 0x000A0000, LENGTH = 384*1024",
"       extended : ORIGIN = 0x00100000, LENGTH = 4095*1024*1024",
"}",
"",
"SECTIONS {",
"   .text 0x00000000 : {",
"       text_frst = . ;",
"       *(.start)",
"       *(.init)",
"       *(.text)",
"       text_last = . - 1 ;",
"   } >conventional",
"",
"   .data : {",
"       data_frst = . ;",
"       *(.data)",
"       data_last = . - 1 ;",
"   } >conventional",
"",
"   .bss : {",
"       bss_frst = . ;",
"       *(.bss)",
"       *(COMMON)",
"       bss_last = . - 1 ;",
"   } >conventional",
"",
"   /* --------------------------------------------------------- */",
"   /* The stack sits just above the bss.  It's size is set here */",
"   /* so that it can be changed without recompiling the code.   */",
"   /* --------------------------------------------------------- */",
"   stack_frst = bss_last + 1 ;",
"   stack_last = bss_last + 32768 ;",
"",
"   /* --------------------------------------------------------- */",
"   /* The heap starts just above the stack and gets the rest.   */",
"   /* --------------------------------------------------------- */",
"   heap_frst = stack_last + 1 ;",
"}",
NULL
} ;

void Error(char *msg, ...)
	{
	va_list arg ;

	va_start(arg, msg) ;
	fprintf(stderr, "\nError: ") ;
	vfprintf(stderr, msg, arg) ;
	fprintf(stderr, "\n") ;
	va_end(arg) ;
	exit(255) ;
	}

void Output(char **text)
	{
	while (*text != NULL) printf("%s\n", *text++) ;
	}

void Library(char *name, char *spec, int size)
	{
	char cmd[500] ;
	FILE *fp ;

	sprintf(cmd, "gcc -print-file-name=%s.a", name) ;
	fp = popen(cmd, "r") ;
	if (!fp) Error("Can't popen: %s", cmd) ;
	fgets(spec, size, fp) ;
	*strchr(spec, '\n') = '\0' ;
	pclose(fp) ;
	}

int main(void)
	{
	char filespec[500] ;

	Output(title) ;
	printf("INPUT(\"./libepc.a\")\n") ;
	Library("libc", filespec, sizeof(filespec)) ;
	printf("INPUT(\"%s\")\n", filespec) ;
	Library("libgcc", filespec, sizeof(filespec)) ;
	printf("INPUT(\"%s\")\n", filespec) ;
	Output(script) ;

	return 0 ;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -