Windows上导出静态库符号并分析依赖关系

2025-01-13 14:48:50
标签: python shell static dumpbin symbol

由于项目有大量静态库,并且在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进行分析做图。

得到相类似的结果。


阅读(0) 收藏(0) 转载(0) 举报/Report
相关阅读

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有