purebasic.info

PureBasic forum
Текущее время: Сб янв 20, 2018 6:15 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: Чт окт 22, 2015 12:39 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 216
Благодарил (а): 30 раз.
Поблагодарили: 21 раз.
Пункты репутации: 0
Развитие мысли от http://purebasic.info/phpBB3ex/viewtopic.php?f=7&t=4274&start=90#p82048
Как использовать:
1) Переименовываем polink.exe => polink_real.exe
2) На его место кладем наш изврат, назвав соответственно polink.exe
Принцип работы:
1) Парсит командную строку линкера, библиотеки складывает в список
2) пытается отключать по очереди каждую библиотеку, и слинковать без нее.
3) при удачном отключении повторяет с оставшимися (на предмет перекрестных ссылок)

работает очень долго (100500 запусков линкера)
если запуск из IDE (выходной файл PureBasic_Compilation*.exe) линкует как есть.

результат любимого пустого окна:
длина: 18944

Удалены:
StringUtility.lib
UnicodeFunctions.lib
MSVCRT.lib
KERNEL32.lib
COMDLG32.lib
ADVAPI32.lib
COMCTL32.lib
OLEAUT32.lib
System.lib
Date.lib
OLEAUT32.LIB
ADVAPI32.LIB
SHELL32.LIB
UUID.LIB
SHELL32.LIB
WINMM.LIB

лог работы можно глянуть в папке компилятора (polink.log)
собрано и опробовано под PB5.31.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
EnableExplicit
OpenConsole()
 
Global GWrkDir$   = GetCurrentDirectory()
Global GMyDir$    = GetPathPart(ProgramFilename())
Global GRealExe$  = GMyDir$ + "polink_real.exe"
Global GLogName$  = GMyDir$ + "polink.log"
 
DeleteFile(GLogName$, #PB_FileSystem_Force)
Global GLogFile   = OpenFile(#PB_Any, GLogName$)
 
Structure Libs
  name$
  use.i
EndStructure
Global NewList GLibs.Libs(), GComStrStatic$, GExitCode
 
;парсит командную строку
;основные команды идут в ComStrStatic$
;библиотеки идут в Libs()
Procedure ParseCommandString()
  Protected tmp$, i, count
  count = CountProgramParameters() - 1
  For i=0 To count
    tmp$ = ProgramParameter(i)
    If Left(tmp$,1)="/" Or tmp$="PureBasic.obj"
      GComStrStatic$ + tmp$ + " "
    Else
      AddElement(GLibs())
      GLibs()\name$=tmp$
      GLibs()\use=#True
    EndIf
  Next
EndProcedure
 
;собирает полную командную строку
Procedure$ AllComStr()
  Protected result$ = GComStrStatic$
  PushListPosition(GLibs())
  ForEach GLibs()
    If GLibs()\use
      result$ + " " + GLibs()\name$
    EndIf
  Next
  PopListPosition(GLibs())
  ProcedureReturn result$
EndProcedure  
 
;запускает истенный линкир и возвращает успешность сборки
Procedure RunRealLink()
  Protected ComStr$ = AllComStr()
  WriteStringN(GLogFile, "ComStr:<" + ComStr$ + ">")
 
  Protected realPrg = RunProgram(GRealExe$, ComStr$, GWrkDir$, #PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Error)
 
  While ProgramRunning(realPrg)
   
    Protected tmp$ = ReadProgramError(realPrg, #PB_Ascii)
    If Len(tmp$)
      ConsoleError(tmp$)
      WriteStringN(GLogFile, "[ERR] " + tmp$)
    EndIf
   
    If AvailableProgramOutput(realPrg)
      tmp$ = ReadProgramString(realPrg, #PB_Ascii)
      PrintN(tmp$)
      WriteStringN(GLogFile, "[STD] " + tmp$)
    EndIf
   
    Delay(1)
  Wend
 
  Protected exitCode = ProgramExitCode(realPrg)
  WriteStringN(GLogFile, "ExitCode: " + Str(exitCode))
 
  ProcedureReturn exitCode
EndProcedure
 
;попытка выкинуть Libs(position)
;в случае успеха, все предыдущие.
Procedure DelLib(Position)
  Protected i
  SelectElement(GLibs(), Position)
  If GLibs()\use
    GLibs()\use = 0
    GLibs()\use = RunRealLink()
    If Not GLibs()\use And Position
      For i=1 To Position
        DelLib(i-1)
      Next
    EndIf
  EndIf
EndProcedure
 
 
ParseCommandString()
 
;проверяем с полным набором
GExitCode = RunRealLink()
 
;если запуск из IDE
If FindString(GComStrStatic$,"PureBasic_Compilation",#PB_String_NoCase)
  End GExitCode
EndIf
 
;если с полным набором не собирается, сразу выходим
If GExitCode
  End GExitCode
EndIf
 
;если с полным компилируется, пытаемся выкинуть либы
Define i, count = ListSize(GLibs())-1
For i=0 To count
  DelLib(i)
Next
 
;финальная сборка с тем что осталось  
WriteStringN(GLogFile, "Final pass:")
GExitCode = RunRealLink()
 
WriteStringN(GLogFile, "Libs Excluded:")
ForEach GLibs()
  If Not GLibs()\use
    WriteStringN(GLogFile, GLibs()\name$)
  EndIf
Next
WriteStringN(GLogFile, "End")
 
 
End GExitCode
 
 
 
; IDE Options = PureBasic 5.31 (Windows - x86)
; ExecutableFormat = Console
; CursorPosition = 53
; Folding = o
; Executable = polink.exe
; DisableDebugger
; CompileSourceDirectory



зы. это конечно не путь "настоящего джедая", а скорее ананистические припадки, но работает :D
по хорошему надо создать символьную карту для всех либ, и по ней уже вычислять зависимости(возмется кто-нить?)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт окт 22, 2015 12:44 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11080
Благодарил (а): 4 раз.
Поблагодарили: 385 раз.
Думаю смысла в этом нет. Если библиотека нужна, то без нее не скомпилируется, а если не нужна, линкер ее проигнорирует.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт окт 22, 2015 12:51 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 216
Благодарил (а): 30 раз.
Поблагодарили: 21 раз.
Пункты репутации: 0
Так и есть, тему можно сносить :?
зы. видимо резать надо в .asm файле...


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB