[PATCH] D100651: [AIX] Support of Big archive (read)
Esme Yi via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 14 02:43:11 PDT 2021
Esme added inline comments.
================
Comment at: llvm/lib/Object/Archive.cpp:1013
+ return child_end();
+ const char *Loc = Data.getBufferStart() + strlen(Magic) + sizeof(Archive::ArFixLenHdrType);
+ Child C(this, Loc, &Err);
----------------
EGuesnet wrote:
> Esme wrote:
> > It's not correct to calculate the offset of the first archive member by `Data.getBufferStart() + strlen(Magic) + sizeof(Archive::ArFixLenHdrType);`, please use the value of `ArFixLenHdr->FirstArOffset`.
> > You can easily reproduce the bug if you test a archive file which contains a object file member like the comment I added before:
> > ```
> > $ xlc 1.c -o 1.o
> > $ ar -v -q 1.a 1.o
> > $ llvm-ar tv 1.a
> > llvm-ar: error: unable to load '1.a': truncated or malformed archive (characters in size field in archive header are not all decimal numbers: '\000\000\000\000\000\000\000\000\000\0005892' for archive member header at offset 128)
> > ```
> > The correct offset for this case should be 138 instead of 128.
> First, LLVM is no more a priority of our team, so I cannot spend time to this PR.
> Second, I am not able to reproduce. Please give me content of 1.c, and content of 1.a.
> ```
> // small.c
> int add_two (int a) {
> return a + 2;
> }
>
> $ xlc -v
> C for AIX Compiler, Version 5
>
> OK, really old, but we don't care for archive.
>
> $ xlc small.c -o small.o -c
> $ ar -v -q small.a small.o
>
> $ xxd small.a
>
> 00000000: 3c62 6967 6166 3e0a 3130 3730 2020 2020 <bigaf>.1070
> 00000010: 2020 2020 2020 2020 2020 2020 3132 3332 1232
> 00000020: 2020 2020 2020 2020 2020 2020 2020 2020
> 00000030: 3020 2020 2020 2020 2020 2020 2020 2020 0
> 00000040: 2020 2020 3132 3820 2020 2020 2020 2020 128
> 00000050: 2020 2020 2020 2020 3132 3820 2020 2020 128
> 00000060: 2020 2020 2020 2020 2020 2020 3020 2020 0
> 00000070: 2020 2020 2020 2020 2020 2020 2020 2020
> // End of Fixed-Length Header: size is 128
> 00000080: 3832 3020 2020 2020 2020 2020 2020 2020 820
> 00000090: 2020 2020 3130 3730 2020 2020 2020 2020 1070
> 000000a0: 2020 2020 2020 2020 3020 2020 2020 2020 0
> 000000b0: 2020 2020 2020 2020 2020 2020 3136 3331 1631
> 000000c0: 3630 3435 3039 2020 3020 2020 2020 2020 604509 0
> 000000d0: 2020 2020 3020 2020 2020 2020 2020 2020 0
> 000000e0: 3634 3420 2020 2020 2020 2020 3720 2020 644 7
> [...]
>
> $ llvm-ar --version
> LLVM version 13.0.0
>
> $ llvm-ar t small.a
> small.o # OK
> ```
>
> Third, according documentation https://www.ibm.com/docs/en/aix/7.2?topic=formats-ar-file-format-big , Fixed-Length Header must have a size of 128. 138 is not valide.
Thanks for your reply!
1. If you are no longer following up on this patch, I'd be happy to continue your work. How do you think?
2. In my previous comment, a binary member is added to the archive, while in your case, there is an object member (compiled with `-c` option) in archive.
You can also reproduce the issue if you add a dynamic lib to an archive.
```
$ cat 1.c
int main() {
return 1;
}
$ xlc 1.c -qmkshrobj -o libt.so
$ ar -v -q 1.a libt.so
$ xxd 1.a
00000000: 3c62 6967 6166 3e0a 3134 3532 2020 2020 <bigaf>.1452
00000010: 2020 2020 2020 2020 2020 2020 3136 3134 1614
00000020: 2020 2020 2020 2020 2020 2020 2020 2020
00000030: 3020 2020 2020 2020 2020 2020 2020 2020 0
00000040: 2020 2020 3133 3420 2020 2020 2020 2020 134
00000050: 2020 2020 2020 2020 3133 3420 2020 2020 134
00000060: 2020 2020 2020 2020 2020 2020 3020 2020 0
00000070: 2020 2020 2020 2020 2020 2020 2020 2020
00000080: 0000 0000 0000 3131 3935 2020 2020 2020 ......1195
// There are some padding between the Fixed-Length Header and the First member.
00000090: 2020 2020 2020 2020 2020 3134 3532 2020 1452
000000a0: 2020 2020 2020 2020 2020 2020 2020 3020 0
000000b0: 2020 2020 2020 2020 2020 2020 2020 2020
```
3. It's correct that `Fixed-Length Header must have a size of 128. 138 is not valide.` As above, there may be some padding between the Fixed-Length Header and the first member. So I think the value of `ArFixLenHdr->FirstArOffset` is the exact offset to the first member.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D100651/new/
https://reviews.llvm.org/D100651
More information about the llvm-commits
mailing list