unsure about asm-offsets.c compilation in U-boot source - u-boot

I could see lib/asm-offset.c file in u-boot(2014.07) source(another file at arch/arm/lib/asm-offsets.c), main function is defined in these files. Initially I got doubht who will call this main function, I checked Makefile, but no entry for this file in Makefile also. After build there is no object file for this. I could see only asm-offsets.s and asm-offsets.su files after build. asm-offsets.s is around 1000 lines and asm-offsets.su is having only one line - asm-offsets.c:19:5:main 0 static. From the asm-offsets.c source, it seems it is declaring some variables. Can you please help to understand how this source is embedded in U-boot bin

lib/asm-offsets.c file is used to generate header file with definitions for global data size, board info size etc..., These definitions will be used in assembly files.
We can see following lines while building u-boot.
CC lib/asm-offsets.s
GEN include/generated/generic-asm-offsets.h
similarly for arch/arm/lib/asm-offsets.c
CC arch/arm/lib/asm-offsets.s
GEN include/generated/asm-offsets.h

Related

Making CMake compile more than 1 source file instead of just the main source file (Similar to .ino of arduino) for code clarity

I've got a piece of code in C in the main.c file of my program which is for embedded ESP 32 in ESP-IDF for context, and I'd like to cut and move some of the code like global variables callback functions definitions etc to other files like init.c, my_functions.c etc without creating a special library with header file and using 3include<lib.h> similar to how you can do it in arduino with ino files.
Is such a thing possible with CMake or ESP-IDF?

How do I view the header file (.h) that was included while debugging the executable file?

I need to verify that the latest changes to the header file were included in my executable that was compiled via GDB. Basically I want to run the gdb on the executable and list the source code in the header file.
I've tried
gdb load_update_recs (executable)
list (only lists the lines from the c program I compiled and not the header file)
I would like to list the source code of the header file in GDB
The debug information doesn't include a copy of the source code, it includes a reference to the file and line number. So, if you change the header file and then list the source file, you'll see the latest source file version, even if this isn't what is actually compiled into your program. In theory GDB should warn you if it can see that the source file was modified after the executable, however, if for some reason timestamps are not working / corrupted on your source file or executable, then this warning might not appear.
With that warning out of the way, if you just list then GDB will try to list source lines around the current location, or if you're not running, I think the first main source file (not header file) from your program.
What you can do though is supply list with a location, so list my_header.h:20 to list line 20 of my_header.h. Though this is only going to show you the current contents of that file.
GDB provides two functions to help you view header files: (1) list sources, and (2) edit filename:linenum. Asnoted y previous answer, gdb cannot tell if the file is current
The list sources will show you all source files in the build (for files compiled with -g). For example, the program
#include <stdlib.h>
#include <stdio.h>
void main(void) { int x ;
fgets(NULL, 100, stdin) ;
}
Will show
gdb a.out
(gdb) info sources
Source files for which symbols have been read in:
/home/owner/a.c, /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h, /usr/include/x86_64-linux-gnu/bits/types.h, /usr/include/x86_64-linux-gnu/bits/libio.h,
/usr/include/stdio.h, /usr/include/x86_64-linux-gnu/bits/sys_errlist.h
You can request editing/viewing of any file using 'edit filename:line'. Filename can be specified without a path, if it's distinct
edit stdio.h:1
# If base name not unique, use full path:
edit /usr/include/stddef.h:1
Note that the line number is mandatory

Error: L6218E: Undefined symbol main (referred from __rtentry2.o)

anyone can help me?? my board is LPC1768 and the sensor is BMP180
Rebuild target 'Target 1'
compiling BMP180.c...
compiling I2C.c...
assembling startup_LPC17xx.s...
compiling system_LPC17xx.c...
compiling GPIO_LPC17xx.c...
compiling PIN_LPC17xx.c...
linking...
.\Objects\asdsa.axf: Error: L6218E: Undefined symbol main (referred from __rtentry2.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 1 error messages.
".\Objects\asdsa.axf" - 1 Error(s), 0 Warning(s).
Target not created.
I found the solution is easy, but before going deeper into the solution, keep in mind that C compilation unit (C Compiler and Assembler at least) compiles each pure C source file after resolving necessary pre-processor directives, and generates a relocatable object file as a result of compilation.
After the compilation unit does its job, there is another unit that is responsible for combining individually every source file that is compiled successfully into the relocatable form of one big object file for all. This unit is called Linker and the operation is called Linking
A very important feature in relocatable object file is that what is called variable, function will be noted as symbol so far. The linker has to solve the symbols, defining what is originally defined in an object file, reference what is being used in another to their original object file.
After this motivation, now we can call main() function as main() symbol.
I Found that the problem is because the source file that contains the main() function was not compiled. As a result, there is no a relocatable object file that contains the symbol corresponding to main() function. Hence, the compiler is complaining: you asked me to use (reference) a symbol you guaranteed to be found (defined) in another file but I found no such symbol!
The solution:
For Kiel IDE, to queue a source file for a compilation; you gotta shortlist it in the category "Source Group",by clicking right, either adding new files to group, or existing files to group. It will result in something like the following figure:
Now we have a main function, is turned (defined) to main symbol later, and found by the linker to reference it to whatever use it in any other relocatable object files.
I solved this problem with the following steps;
Delete your old project and create new project
Choose true library from Manage Run Time Environment like so:
Configure "Options for Target" segment. Define symbol USE_STDPERIPH_DRIVER and define project path like so:
Test your configuration. Please write the following code:
#include "stm32f10x.h" // Device header
int main() {
}
I had the same issue. The problem was that the function name in .c file had a different name with the one in the .h file, and I didn't know.
just add your c file (ex: 'main.c') to the source group (ex: 'source group 1') by expanding the target then right click on the source group, choose add existing files to group 'your source group', then choose the main.c file.
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/14222.html
This should help.
Just create a dummy main() or main.c file. Linker can't find it in your pjt.
For solution only add this file C to driver folder and translate it,
Solved: This "Target Not Created" Issue was Resolved by the setting of Run Time Environment as shown in below(url) image.https://i.stack.imgur.com/kJ4IL.jpg ( consisting of CMSIS and Device supporting components in Run time environment)
{ compiling TransformFunctions.c...
linking...
Program Size: Code=768 RO-data=320 RW-data=4 ZI-data=612
FromELF: creating hex file...
".\Objects\LPC1768_B_T.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:07
}

Understand the linux build process

I'm trying to build the linux kernel and would like to understand a few things:
I have added a new file (b.c) to a certain directory with the intention of having the file compiled in. The Makefile has been updated accordingly. While compiling the file, an error is thrown saying that a certain header (a.h) is not found. However, other files in the same directory use a.h without any issues.
I have observed that .o.cmd file get created for all files except b.c. Is this a prerequisite for the headers to be correctly included? Does this file have any significance to the issue I'm facing?
For eg: I added 'async_infra.o' to this line in the Makefile:
uml_gre-objs := uml_gre_kern.o uml_gre_user.o async_infra.o
uml_gre_user.c includes the header that I'd like to be included in async_infra.c
Any suggestions on what's missing and how to address the issue will be appreciated.

C - How are c source files incuded without an include statement

I've taken the plunge and am learning C. It's been a pretty good but manageable learning curve coming from a scripting (php, perl) background with only a little bit of C#.
I've used the web-site "Learn C The Hard Way" and am so far grasping reasonably well (I think) but I can't understand this part of one of the exercises:
http://c.learncodethehardway.org/book/ex19.html
He created four source files - object.h, object.c, ex19.h, ex19.c
But I don't understand how the object.c file is included.
The main function is located in ex19.c, and it has the line
#include "ex19.h"
File ex19.h has the line
#include "object.h"
But object.h makes no reference to including object.c. Interestingly object.c contains the line
#include "object.h"
Is there some sort of implied include where if you include the header file, it will automatically include the c source code of the same name?
This is the job of a separate program called the linker. In C, source files need access to the header files of other C source files so that they can see information about what functions, types, and variables are defined by that second C file that the first file might want to use. Each C file is then compiled independently of the rest. The output of the compiler is an object file.
To build a final program, a second program called the linker comes in and combines all the object files together into the overall executable. This program is tasked with taking the implementations of all the different C files and cross-referencing them against one another so that each time one C file references a function or variable in a different C file, that reference can actually be made to the appropriate object.
This is why you don't need to include .c files. Once a source file has a header, it knows enough about the other file in order to use the functions it provides for the compiler to verify that it's using them correctly. The linker then handles of the job of actually making the cross-references. You can think of the compiler as a program that checks to see that if the functions are defined, then the program would work. The linker then actually checks to make sure that those functions are defined in the first place and sets up the appropriate links in the executable.
Hope this helps!
Object.c is not included.
It's compiled as it's own unit and it includes object.h
See the make file:
CFLAGS=-Wall -g
all: ex19
ex19: object.o
clean:
rm -f ex19
ex19: object.o tells you that object.o must be created before ex19 can be built, and this is picked up by default from make file as an object.c exists.
So this make file says
to build all you need ex19, to get ex19 you need object.o, and the to create object.o the makefile picks up object.o built from the object.c
From the page you reference:
make can't see anything in the file for object.o, but it does see an
object.c file, and it knows how to turn a .c into a .o, so it does
that.
The entire logic lies in the makefile and an intelligent compiler. The final binary created has an object file named as object.o which will ideally contain all the function definitions defined in object.h file. It is the linker which links the functions declared in .h file with the definition which are available in .o file.

Resources