由于项目有大量静态库,并且在Windows平台的实现和Linux有不少区别,因此需要在Windows平台也做一份符号依赖分析。
从静态库导出符号,这步需要借助dumpbin工具。
用powershell实现
$originalPath = Get-Location
cd D:\Neuecax_Dynamic\olb
Remove-Item *.full_symbol -Force
Get-ChildItem z*.lib | ForEach-Object {
$outputFile = "$($_.BaseName).full_symbol"
& "C:\Program
Files (x86)\Microsoft Visual
Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x86\dumpbin.exe" /SYMBOLS $_.FullName | Out-File -FilePath $outputFile -Encoding
utf8
Write-Output "Generated: $outputFile"
}
Set-Location $originalPath
cd D:\Neuecax_Dynamic\obj
Remove-Item *.full_symbol -Force
Get-ChildItem *\*.obj | ForEach-Object {
$parentDir = Split-Path $_.FullName -Parent
$outputFile = "$($_.BaseName).full_symbol"
$fullPath = Join-Path -Path $parentDir -ChildPath $outputFile
& "C:\Program
Files (x86)\Microsoft Visual
Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x86\dumpbin.exe" /SYMBOLS $_.FullName | Out-File -FilePath $fullPath -Encoding
utf8
Write-Output "Generated: $fullPath"
}
Set-Location $originalPath
然后把这些数据拷贝到另一个目录待用
$sourceDirectory = "D:\Neuecax_Dynamic\obj"
$destinationDirectory = "D:\ideasSymbols\input_win"
if (-not (Test-Path -Path $destinationDirectory))
{
New-Item -ItemType
Directory -Path $destinationDirectory
}
Get-ChildItem -Path $sourceDirectory -Recurse -Directory | ForEach-Object {
$subDir = $_.FullName
$files = Get-ChildItem -Path $subDir -Filter "*.full_symbol" -File
foreach ($file in $files)
{
$relativePath = $subDir.SubString($sourceDirectory.Length + 1)
$targetDir = Join-Path -Path $destinationDirectory -ChildPath $relativePath
if (-not (Test-Path -Path $targetDir))
{
New-Item -ItemType
Directory -Path $targetDir
}
Move-Item -Path $file.FullName -Destination $targetDir
}
}
Write-Output "All
'.full_symbol' files have been copied
to $destinationDirectory."
接着这步就更麻烦,把刚才这堆文件拷贝到Linux上,调用shell去预处理,因为shell批量处理这些文件更容易些,但后续需要逻辑的那部分用python更方便。
find . -name "*.full_symbol" | xargs -P `nproc` -I {} sh -c 'grep
-E " External " {} | grep -v " UNDEF " > $(echo "{}"
| sed "s/\.full_symbol$/.TSYM/")'
后面是把找到的文件后缀替换为.TSYM
find . -name "*.full_symbol" | xargs -P `nproc` -I {} sh -c 'grep
-E " UNDEF .* External " {} > $(echo "{}" | sed
"s/\.full_symbol$/.USYM/")'
把带External没有UNDEF的放在T符号文件中,把External
UNDEF的放在U符号中。
再用
find . -name "*SYM" | xargs -n 1 -P `nproc` -I {} sh -c 'cut
-d "|" -f 2 {} > {}_win'
把原始的内容处理成
只有符号修释过的名字和人能看懂的名字
处理前的样子
到
处理后的样子
到这步,基本和Linux没有区别了
把原始符号和修饰过的符号分别存进不同的json文件,然后用python进行分析做图。
得到相类似的结果。
Windows上导出静态库符号并分析依赖关系
由于项目有大量静态库,并且在Windows平台的实现和Linux有不少区别,因此需要在Windows平台也做一份符号依赖分析。
从静态库导出符号,这步需要借助dumpbin工具。
用powershell实现
$originalPath = Get-Location
cd D:\Neuecax_Dynamic\olb
Remove-Item *.full_symbol -Force
Get-ChildItem z*.lib | ForEach-Object {
$outputFile = "$($_.BaseName).full_symbol"
& "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x86\dumpbin.exe" /SYMBOLS $_.FullName | Out-File -FilePath $outputFile -Encoding utf8
Write-Output "Generated: $outputFile"
}
Set-Location $originalPath
cd D:\Neuecax_Dynamic\obj
Remove-Item *.full_symbol -Force
Get-ChildItem *\*.obj | ForEach-Object {
$parentDir = Split-Path $_.FullName -Parent
$outputFile = "$($_.BaseName).full_symbol"
$fullPath = Join-Path -Path $parentDir -ChildPath $outputFile
& "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x86\dumpbin.exe" /SYMBOLS $_.FullName | Out-File -FilePath $fullPath -Encoding utf8
Write-Output "Generated: $fullPath"
}
Set-Location $originalPath
然后把这些数据拷贝到另一个目录待用
$sourceDirectory = "D:\Neuecax_Dynamic\obj"
$destinationDirectory = "D:\ideasSymbols\input_win"
if (-not (Test-Path -Path $destinationDirectory)) {
New-Item -ItemType Directory -Path $destinationDirectory
}
Get-ChildItem -Path $sourceDirectory -Recurse -Directory | ForEach-Object {
$subDir = $_.FullName
$files = Get-ChildItem -Path $subDir -Filter "*.full_symbol" -File
foreach ($file in $files) {
$relativePath = $subDir.SubString($sourceDirectory.Length + 1)
$targetDir = Join-Path -Path $destinationDirectory -ChildPath $relativePath
if (-not (Test-Path -Path $targetDir)) {
New-Item -ItemType Directory -Path $targetDir
}
Move-Item -Path $file.FullName -Destination $targetDir
}
}
Write-Output "All '.full_symbol' files have been copied to $destinationDirectory."
接着这步就更麻烦,把刚才这堆文件拷贝到Linux上,调用shell去预处理,因为shell批量处理这些文件更容易些,但后续需要逻辑的那部分用python更方便。
find . -name "*.full_symbol" | xargs -P `nproc` -I {} sh -c 'grep -E " External " {} | grep -v " UNDEF " > $(echo "{}" | sed "s/\.full_symbol$/.TSYM/")'
后面是把找到的文件后缀替换为.TSYM
find . -name "*.full_symbol" | xargs -P `nproc` -I {} sh -c 'grep -E " UNDEF .* External " {} > $(echo "{}" | sed "s/\.full_symbol$/.USYM/")'
把带External没有UNDEF的放在T符号文件中,把External UNDEF的放在U符号中。
再用
find . -name "*SYM" | xargs -n 1 -P `nproc` -I {} sh -c 'cut -d "|" -f 2 {} > {}_win'
把原始的内容处理成
只有符号修释过的名字和人能看懂的名字
到
到这步,基本和Linux没有区别了
把原始符号和修饰过的符号分别存进不同的json文件,然后用python进行分析做图。
得到相类似的结果。