Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can GCC not complain about undefined references?

Under what situation is it possible for GCC to not throw an "undefined reference" link error message when trying to call made-up functions?

For example, a situation in which this C code is compiled and linked by GCC:

void function() {     made_up_function_name();     return; } 

...even though made_up_function_name is not present anywhere in the code (not headers, source files, declarations, nor any third party library).

Can that kind of code be accepted and compiled by GCC under certain conditions, without touching the actual code? If so, which?

Thanks.

EDIT: no previous declarations or mentions to made_up_function_name are present anywhere else. Meaning that a grep -R of the whole filesystem will only show that exact single line of code.

like image 318
STenyaK Avatar asked Apr 05 '11 17:04

STenyaK


People also ask

How do you resolve an undefined reference?

The error: undefined reference to function show() has appeared on the terminal shell as predicted. To solve this error, simply open the file and make the name of a function the same in its function definition and function call. So, we used to show(), i.e., small case names to go further.

How do you fix a undefined reference in C ++?

You can fix undefined reference in C++ by investigating the linker error messages and then providing the missing definition for the given symbols. Note that not all linker errors are undefined references, and the same programmer error does not cause all undefined reference errors.


2 Answers

Yes, it is possible to avoid reporting undefined references - using --unresolved-symbols linker option.

g++ mm.cpp -Wl,--unresolved-symbols=ignore-in-object-files 

From man ld

--unresolved-symbols=method

Determine how to handle unresolved symbols. There are four possible values for method:

       ignore-all            Do not report any unresolved symbols.         report-all            Report all unresolved symbols.  This is the default.         ignore-in-object-files            Report unresolved symbols that are contained in shared            libraries, but ignore them if they come from regular object            files.         ignore-in-shared-libs            Report unresolved symbols that come from regular object            files, but ignore them if they come from shared libraries.  This            can be useful when creating a dynamic binary and it is known            that all the shared libraries that it should be referencing            are included on the linker's command line. 

The behaviour for shared libraries on their own can also be controlled by the --[no-]allow-shlib-undefined option.

Normally the linker will generate an error message for each reported unresolved symbol but the option --warn-unresolved-symbols can change this to a warning.

like image 76
Dmitry Yudakov Avatar answered Oct 08 '22 21:10

Dmitry Yudakov


TL;DR It can not complain, but you don't want that. Your code will crash if you force the linker to ignore the problem. It'd be counterproductive.

Your code relies on the ancient C (pre-C99) allowing functions to be implicitly declared at their point of use. Your code is semantically equivalent to the following code:

void function() {     int made_up_function_name(...); // The implicit declaration      made_up_function_name(); // Call the function     return; } 

The linker rightfully complains that the object file that contains the compiled function() refers to a symbol that wasn't found anywhere else. You have to fix it by providing the implementation for made_up_function_name() or by removing the nonsensical call. That's all there's to it. No linker-fiddling involved.

like image 42
Kuba hasn't forgotten Monica Avatar answered Oct 08 '22 19:10

Kuba hasn't forgotten Monica