feedforward 发表于 2023-11-6 17:22:57

gcc改变链接顺序

问题原型:
OBJ=Load.o serial.o dbgput_nof.o $(RES)

LINKOBJ = Load.o serial.o dbgput_nof.o -Ttext=0x40000000 -nostartfiles -n -N -T linksparc.ld stack.ld $(RES)

$(BIN): $(OBJ)
                $(LD) $(LINKOBJ) -o "Load.exe" $(LIBS)
我们想调整 Load.o serial.o的链接顺序,很容易,只需改为如下即可:
OBJ = serial.o Load.o dbgput_nof.o $(RES)

LINKOBJ = serial.o Load.o dbgput_nof.o -Ttext=0x40000000 -nostartfiles -n -N -T linksparc.ld stack.ld $(RES)

$(BIN): $(OBJ)
         $(LD) $(LINKOBJ) -o "Load.exe" $(LIBS)但是我们想$(LIBS)中某个库链接到最前面该怎么做呢?
$(BIN): $(OBJ)
                     $(LD) $(LIBS) $(LINKOBJ) -o "Load.exe"上述改法将会报错。
正确的改法应该在.ld链接命令文件中改:
.text :
{
    CREATE_OBJECT_SYMBOLS
    text_start = .;
    _text_start = .;   
    *(.text)
    . = ALIGN (16);

    *(.eh_frame)
    . = ALIGN (16);
   
    _rodata_start = . ;
    *(.rodata*)
/**(.gnu.linkonce.r*) */
    _erodata = ALIGN( 0x10 ) ;

    etext = ALIGN(0x10);
    _etext = .;
    *(.init)
    *(.fini)
    *(.lit)
    *(.shdata)
    . = ALIGN (16);
    _endtext = .;
} >ram

例如,我们想让$(LIBS)中的libTask.a链接到最前面,我们应该这样改
.text :
{
CREATE_OBJECT_SYMBOLS
text_start = .;
_text_start = .;
libTask.a(.text)
*(.text)
. = ALIGN (16);

*(.eh_frame)
. = ALIGN (16);
   
    _rodata_start = . ;
*(.rodata*)
/* *(.gnu.linkonce.r*) */
_erodata = ALIGN( 0x10 ) ;

etext = ALIGN(0x10);
_etext = .;
*(.init)
*(.fini)
*(.lit)
*(.shdata)
. = ALIGN (16);
_endtext = .;
} >ram



页: [1]
查看完整版本: gcc改变链接顺序