<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/74529>74529</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LLVM-Tools] [LLVM-ReadElf] Errorneous JSON Output when using --needed-libs
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
carstencodes
</td>
</tr>
</table>
<pre>
## Description
I am using LLVM-readelf to find out the needed libraries of a shared object. The data shall be formatted as json and passed to a JSON processing library, where it is parsed and processed.
## How To Reproduce
```shell
$ llvm-readelf-15 --needed-libs --pretty-print --elf-output-style=JSON /usr/lib/libgdiplus.so | jq
...
```
## Expected Behavior
Output like
```json
[
{
"/usr/lib/libgdiplus.so": {
"FileSummary": {
"File": "/usr/lib/libgdiplus.so",
"Format": "elf64-x86-64",
"Arch": "x86_64",
"AddressSize": "64bit",
"LoadName": "libgdiplus.so.0"
},
"NeededLibraries": [
"libX11.so.6",
"libc.so.6",
"libcairo.so.2",
"libexif.so.12",
"libfontconfig.so.1",
"libfreetype.so.6",
"libgif.so.7",
"libglib-2.0.so.0",
"libjpeg.so.8",
"libm.so.6",
"libpng16.so.16",
"libpthread.so.0",
"libtiff.so.5"
]
}
}
]
```
## Actual Behavior
```
parse error: Invalid numeric literal at line 12, column 0
```
## Output without JQ
```
[
{
"/usr/lib/libgdiplus.so": {
"FileSummary": {
"File": "/usr/lib/libgdiplus.so",
"Format": "elf64-x86-64",
"Arch": "x86_64",
"AddressSize": "64bit",
"LoadName": "libgdiplus.so.0"
},
"NeededLibraries": [libX11.so.6
libc.so.6
libcairo.so.2
libexif.so.12
libfontconfig.so.1
libfreetype.so.6
libgif.so.7
libglib-2.0.so.0
libjpeg.so.8
libm.so.6
libpng16.so.16
libpthread.so.0
libtiff.so.5
]
}
}
]
```
## Versions
Tried with LLVM
- 11
- 12
- 13
- 14
- 15
- 16
- 17
## Possible Issue Location
I think the faulting location is in [ELFDumper.cpp:2566](https://github.com/llvm/llvm-project/blob/d6fbd96e5eaf3e8acbf1b43dce7a311352907567/llvm/tools/llvm-readobj/ELFDumper.cpp#L2566C1-L2567C32):
Instead of using
```C++
for (StringRef L : Libs)
W.startLine() << L << "\n";
```
it should be something like
```C++
W.printList(Libs);
```
But I actually don't know the interna about ArrayRef and StringRef and have no Idea whether this would work.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkV01z4jgT_jXi0mWXLWMbDhwSCPVmindmd5Ka2duWbLWxEiF5JTkf--u3JDBfw4SavS5FgdxqPd0t9dNuMWvFWiHOSH5L8sWI9a7VZlYzYx2qWnO0o0rz9xmhGaEZLNDWRnROaEWSBUlutr_3wDbQW6HWsFp9-39kkHGUDTgNjVAcdO_AtQgKkSMHKSrDjEALugEGtmUGOejqCWsXw2OLwJkLcimhQmi02TDnkAOz8GS1AqY4dMxa5N4Gg08PXz5DZ3SNNnixtfBO6BxeWzQIwoGw0DHjl4TVW2Xk8XEguzD_p1_hUcNX7IzmfY0nKkWy_doWpRyWjUHKl80QeJTmEEXbaCMpKgtR1Bl07j3qjFAOoshr6d51vYuse5dIskUIgtBlbw2hSymq7e-ai072NrYaSDmHp7-2NuM4PnPoQiB3bx3WfuNusWUvQptjnS_BPEjxjHAxQr_VO1F-ux0AkHIYEko_8tZPZzdH-uFDKF0KiQ_9ZhMO6ExnNz3Ir1ug82P0LX5IlwMEyqYYR2-TIirGP1lyY-r2sOBtUvx5pup1ODdo7YP4-8i9YlwJ9xPQlWb8M9scaZ94Hyd-YgdfLs4QCKWfQ_6sBrIMMPntqaUd8B9p6kGLc7elqOofJ07X1kwY7ZXohdX4Jho_l9IPEBqtXK1VI9ZB9QJMYxDde4fXfFlvrZUXINZSVBGNk_3m_QTiqcPgxuQCxuaa_U6t0yIEcWkrO9d6jl_zwIkmRJEfjng7my8Oj_7QD8e_49niOqlvatczeZHSZ8tCvQM0RhufOvfqhUnBQfUbNKIGKRwaJoH5IqAQ_AnPoday3yhIrjuyKyCvwrW-wn_6_QNXLlaQ7X79UhG5Uj_gpMr8izLyX6gfx9UiLDnUiP3joSIMoqM6MIjOWb-Xn3B9kO6ZvRec8HmQHtg7SDanOMcM3cuOeTkIDyw8JdcR836Ret_QWKGVPZ56NAJ5IEFofk5epRGk6X5E96NsPxrvR_l-VOxH5QUXftPWikoi3FvbI6x0zX5sx1wr1HNouRrWSxdaop2i74OE8mlwt1ou-k2HJq67jmQ3NC8Kvwt00jrXWZLdELokdLkWru2ruNYbzxz5MvxFndG-ZSN0WUntacWLpuLTAnNkTYYTVldNWo0zXmPJsjTNcjpNyrwoDzhOa2kHPH-CunoidHnqGs1W3rd5Gvn_cp5RQqfeveOYlXXIuO8ot43oxVo0J_TWf4O00QYInTw4I9T6KzawAk-Qlaisx9-T6XtsHTNuJRQSOiF0CiSbk2we9MPAUyufq8Cw2w-ySDiwre4l912t1Rv057QOHdh1d-F7HJrHlbCO0Mng5ocGb3sH98DCC0O-A9eK0NLBs9KvITuEcmgUA1b5An5jDHv3G-Eb5MO2-KeWvSAoDfccmW-pXYvGZ5mF1xDPqzbPJ530iM8yPs2mbISztEzSSZpN8nLUzpqiqorJJMma8bSmtJhOxlU9LcY1qzLe0HwkZjShWUqTnNJknJZxMk0LliR0Mp02jJVIxglumJCxT5pYm_VIeCrMynFOpyPJKpQ2XGgoVfgKYTKc0GJkZiHRqn5tyTiRwjp7QHHCyXATCneYx5CZ-QIGwVdk_E42XnTn36gKdW-3N4_hRdii2mXfSfc_6o2c_TKngt-eGyGufwIAAP__21bGKg">