Issue 161030
Summary [COFF] Invalid symbol table entry in compiled Windows exectuable file
Labels new issue
Assignees
Reporter mmk2147483647
    After upgrading Clang/LLVM from 20.1.8 to 21.1.1 in MSYS2 on Windows 11,
CGO stops working with the following error messages:

```
# runtime/cgo
cgo: cannot parse $WORK\b003\_cgo_.o as ELF, Mach-O, PE or XCOFF
```

```
offset 0 is before the start of string table
```

It turns out that invalid COFF file is produced by LLVM.

Some entries in symbol table have their 8 bytes of name field being all zero,
which corresponds to an invalid 0 offset to the string table.

The problem can be easily reproduced by a simple hello world program.

```c
#include <stdio.h>

int main() {
  printf("Hello World\n");
}
```

```
clang -o hello.exe hello.c
```

The compiled executable runs successfully,
but objdump will expose the problem.

When objdump sees the invalid symbol names with offset 0,
it reads a string from the 4-byte header of the string table (which contains the size of the string table),
essentially reinterprets an integer into a string and outputs that string,
exposing the problem.

```
objdump.exe -t hello.exe
```

```

hello.exe:      file format coff-x86-64

SYMBOL TABLE:
[ 0](sec  2)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 .refptr._MINGW_INSTALL_DEBUG_MATHERR
...
[35](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x000015c0 _cexit
[36](sec  2)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000878 モ
...
[58](sec  2)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000908 モ

[59](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x00001650 strlen
[60](sec  2)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000918 モ

[61](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x00001640 memcpy
[62](sec  2)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000830 モ
...
[67](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x00001620 exit
[68](sec  2)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x000008c8 モ
...
[145](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x000016e0 abort
[146](sec  2)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x000008c0 モ
...
[192](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x000017f0 strncmp
[193](sec  2)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000920 モ
```

```
objdump.exe -d hello.exe
```

```
...
00000001400025c0 <_cexit>:
1400025c0: ff 25 b2 12 00 00           	jmpq	*0x12b2(%rip)           # 0x140003878 <モ
 # >
...
0000000140002650 <strlen>:
140002650: ff 25 c2 12 00 00           	jmpq	*0x12c2(%rip)           # 0x140003918 <モ
 # >
...
00000001400026e0 <abort>:
1400026e0: ff 25 da 11 00 00           	jmpq	*0x11da(%rip)           # 0x1400038c0 <モ
 # >
...
00000001400027f0 <strncmp>:
1400027f0: ff 25 2a 11 00 00            jmpq    *0x112a(%rip)           # 0x140003920 <モ
 # >
...
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to