-
Notifications
You must be signed in to change notification settings - Fork 36
Description
gclang does not seem to identify source input files that are listed inside a linker group.
Environment
- gllvm version 1.3.0
- go version go1.6.2
- llvm version 10
To reproduce:
main.c
:
#include <stdio.h>
int foo(int);
int main(int argc, char ** argv) {
printf("%d\n", foo(argc));
}
lib.c
:
int foo(int i) {
return i+1;
}
Building with gclang main.c -Wl,--start-group lib.c -Wl,--end-group -o main
produces a valid binary. Enabling WLLVM_OUTPUT_LEVEL="DEBUG"
INFO:Entering CC [main.c -Wl,--start-group lib.c -Wl,--end-group -o main]
DEBUG:Compile using parsed arguments:
InputList: [main.c -Wl,--start-group lib.c -Wl,--end-group -o main]
InputFiles: [main.c]
ObjectFiles: []
OutputFilename: main
CompileArgs: []
LinkArgs: [-Wl,--start-group lib.c -Wl,--end-group]
ForbiddenFlags: []
IsVerbose: false
IsDependencyOnly: false
IsPreprocessOnly: false
IsAssembleOnly: false
IsAssembly: false
IsCompileOnly: false
IsEmitLLVM: false
IsLTO: false
IsPrintOnly: false
DEBUG:buildObjectFile: [main.c -c -o .main.c.o]
DEBUG:Calling execCmd(/usr/lib/llvm-10/bin/clang, [main.c -Wl,--start-group lib.c -Wl,--end-group -o main])
DEBUG:execCmd: /usr/lib/llvm-10/bin/clang [main.c -c -o .main.c.o] had exitCode 0
DEBUG:execCmd: /usr/lib/llvm-10/bin/clang [-emit-llvm -c main.c -o .main.c.o.bc] had exitCode 0
DEBUG:execCmd: /usr/lib/llvm-10/bin/clang [main.c -Wl,--start-group lib.c -Wl,--end-group -o main] had exitCode 0
DEBUG:attachBitcodePathToObject recognized .o as something it can inject into.
DEBUG:execCmd: objcopy [--add-section .llvm_bc=/tmp/gllvm479332637 .main.c.o] had exitCode 0
DEBUG:execCmd: /usr/lib/llvm-10/bin/clang [.main.c.o -Wl,--start-group lib.c -Wl,--end-group -o main] had exitCode 0
INFO:LINKING: /usr/lib/llvm-10/bin/clang [.main.c.o -Wl,--start-group lib.c -Wl,--end-group -o main]
DEBUG:Calling [gclang main.c -Wl,--start-group lib.c -Wl,--end-group -o main] returned 0
As you can see lib.c
is not present in the InputFiles
list.
Then executing WLLVM_OUTPUT_LEVEL="DEBUG" get-bc -b -S -o main.bc main
DEBUG:defaultPath = llvm-ar
DEBUG:envPath =
DEBUG:usrPath = llvm-ar
DEBUG:path = /usr/lib/llvm-10/bin/llvm-ar
DEBUG:defaultPath = llvm-link
DEBUG:envPath =
DEBUG:usrPath = llvm-link
DEBUG:path = /usr/lib/llvm-10/bin/llvm-link
INFO:
ea.Verbose: false
ea.WriteManifest: false
ea.SortBitcodeFiles: false
ea.BuildBitcodeModule: true
ea.KeepTemp: false
ea.LinkArgSize: 0
ea.InputFile: main
ea.OutputFile: main.bc
ea.LlvmArchiverName: /usr/lib/llvm-10/bin/llvm-ar
ea.LlvmLinkerName: /usr/lib/llvm-10/bin/llvm-link
ea.ArchiverName: ar
ea.StrictExtract: true
INFO:handleExecutable: artifactPaths = [/tmp/.main.c.o.bc]
INFO:argMax = 1887436
DEBUG:execCmd: /usr/lib/llvm-10/bin/llvm-link [-o main.bc /tmp/.main.c.o.bc] had exitCode 0
Bitcode file extracted to: main.bc.
INFO:Calling [get-bc -b -S -o main.bc main] DID NOT TELL US WHAT HAPPENED
The call does not fail but produces a bitcode that does not contain any definition for function foo
or anything present in lib.c
. I suspect this is due to gllvm
parser just forwarding the linker group to the linker, skipping the bitcode generation phase for input files present there. The code I suspect being the culprit is here and testing in an older version of gllvm (version 1.2.7) does not show the bug.
I understand that does not really make sense to create a group like -Wl,--start-group lib.c -Wl,--end-group
, but I tried to minimize it since the issue is present any time a source file is present in a group among any other library/archive, like for example in Android libhevc fuzzer build script