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-файл параллельно с библиотекой, если велено компилировать под смартлинк.