PVOzerski » 03.06.2005 12:32:54
>OBJ для основного файла существует
Иван, как ты предлагаешь задействовать obj-файл модуля program при смартлинке?
Смотри, что происходит (юзаю один из заключительных билдов 1.9, но вряд ли в 2.0 это сильно иначе):
Вот мы пишем такую прогу:
library test;
procedure proc;export;
begin
end;
exports
proc;
begin
writeln('Hello, world! I has been loaded!');
end.
Вот какой link.res получается при компиляции без смартлинка:
SEARCH_DIR(D:\PAS\fpc102\units\win32\)
SEARCH_DIR(D:\PAS\fpc102\bin\win32\)
INPUT(
D:\PAS\fpc102\units\win32\wdllprt0.o
test.o
)
GROUP(
D:\PAS\fpc102\units\win32\libpSystem.a
)
А вот какой - при смартлинке:
SEARCH_DIR(D:\PAS\fpc102\units\win32\)
SEARCH_DIR(D:\PAS\fpc102\bin\win32\)
INPUT(
D:\PAS\fpc102\units\win32\wdllprt0.o
)
GROUP(
libptest.a
D:\PAS\fpc102\units\win32\libpSystem.a
)
То есть при смартлинке obj-файл главного модуля вообще не прилинковывается.Ты хочешь предложить игнорировать смартлинк для главного модуля и линковать obj-файл вместо библиотеки? А у тебя есть уверенность, что тогда ты сможешь избавиться от всего "мертвого кода", который может в нем содержаться? Вот смотри еще тест. На сей раз это не dll, а экзешник.
procedure TTTT;
begin
writeln('Hello');
end;
begin
end.
Теперь посмотри на asm-код, сделанный компилятором для генерации .o-файла:
.file "tt2.pp"
.section .text
.section .text
.balign 4
.balign 4
.globl P$PROGRAM_TTTT
P$PROGRAM_TTTT:
pushl %ebp
movl %esp,%ebp
subl $4,%esp
movl %ebx,-4(%ebp)
call fpc_get_output
movl %eax,%ebx
movl $_$PROGRAM$_L10,%ecx
movl %ebx,%edx
movl $0,%eax
call fpc_write_text_shortstr
call FPC_IOCHECK
movl %ebx,%eax
call fpc_writeln_end
call FPC_IOCHECK
movl -4(%ebp),%ebx
leave
ret
.section .text
.balign 4
.balign 4
.globl PASCALMAIN
PASCALMAIN:
.globl _main
_main:
pushl %ebp
movl %esp,%ebp
call FPC_INITIALIZEUNITS
call FPC_DO_EXIT
leave
ret
.balign 4
.section .data
.ascii "FPC 1.9.9 [2005/04/27] for i386 - Win32"
.balign 4
.balign 4
.globl THREADVARLIST_P$PROGRAM
THREADVARLIST_P$PROGRAM:
.long 0
.balign 4
.globl FPC_THREADVARTABLES
FPC_THREADVARTABLES:
.long 2
.long THREADVARLIST_SYSTEM
.long THREADVARLIST_P$PROGRAM
.balign 4
.globl FPC_RESOURCESTRINGTABLES
FPC_RESOURCESTRINGTABLES:
.long 0
.balign 4
.globl INITFINAL
INITFINAL:
.long 1,0
.long INIT$_SYSTEM
.long FINALIZE$_SYSTEM
.balign 4
.globl __stklen
__stklen:
.long 262144
.globl __heapsize
__heapsize:
.long 0
.section .data
.section .data
.balign 4
.globl _$PROGRAM$_L10
_$PROGRAM$_L10:
.ascii "\005Hello\000"
.section .data
.section .data
.section .bss
Можно видеть, что "мертвая" процедура TTTT никуда не делась, осталась в коде и должна попасть в конечный экзешник. Конечно, это изъян оптимизатора, но что на данном этапе проще: переделывать оптимизацию или переложить кое-что на линкер?
BTW, я вообще плохо понимаю, чего ради компилятор генерит .o-файл параллельно с библиотекой, если велено компилировать под смартлинк.