Skip to main content

Notice: This Wiki is now read only and edits are no longer possible. Please see: for the plan.

Jump to: navigation, search

HowTo use the CDT to navigate Linux kernel source

Revision as of 17:27, 15 April 2019 by Unnamed Poltroon (Talk) (GCC v8+: Fix internal gcc freestanding headers resolution)

Disclaimer: These steps were last updated for Eclipse 2019‑03, CDT 9.7.0, and Linux v5.1-rc4

  1. Download and install Eclipse plus the CDT.
  2. Configure and build your kernel to define CONFIG_* and generate autoconf.h. This can be done before or after downloading and installing Eclipse.
  3. Ensure that you have the right kernel source (e.g. make sure you are on the right git branch). If you check out another branch later, that's ok, but you will need to re-index the source, which can take a big amount of time.
  4. Start up Eclipse.
  5. Click File -> New -> Project
  6. In the pop-up window, choose C/C++-> C Project. Click Next
  7. Fill in a project name like Linux v5.1
  8. Uncheck the Use default location box and type in the root directory of your kernel into the Location box.
  9. In the Project type: pane, click the Makefile project and select Empty Project
  10. On the right side, select Linux GCC. Click Next
  11. Click Advanced settings... and a Properties dialog will pop up.
  12. Note: At this point, and starting from Eclipse Oxygen, Eclipse will aggressively start indexing your project, which can make Eclipse painfully slow for the rest of the configuration steps below -- especially if the desire is to only index a small relevant part of the kernel. To mitigate that, temporarily disable indexing now by opening C/C++ General section, click on Indexer, click on Enable project-specific settings, then unmark the Enable indexer option.
  13. Open the C/C++ General selection on the left.
  14. Click on Preprocessor Include Paths
  15. Select GNU C in the Languages list
  16. Select CDT User Setting Entries in the Setting Entries list
  17. Click on Add.... Choose Preprocessor Macros File from the top left dropdown, Project Path from the top right dropdown, and enter "include/linux/kconfig.h" into the File text box. Note 1: For older kernels (e.g. 4.1.12, 4.2.7, or less), selecting "include/generated/autoconf.h" works better. In newer kernels, selecting kconfig.h is better as this file includes <generated/autoconf.h> and also makes sure that tests such as IS_ENABLED(option) are correctly expanded by the CDT scanner. Note 2: For kernels older than 2.6.33, the location of autoconf.h is include/linux/autoconf.h
  18. Also add any other macros files you are using.
  19. Click on Indexer
  20. Checkmark the Enable project specific setttings box.
  21. Uncheck Index source files not included in the build
  22. Click on Paths and Symbols on the left.
  23. Select the Includes tab and then select GNU C
  24. Click Add...
  25. Click Workspace... then select your kernel's include, and include/uapi directories
  26. Do another Add, Workspace and add both arch/architecture/include, and arch/architecture/include/uapi directories. e.g., arch/powerpc/include and arch/powerpc/include/uapi (The UAPI directories are due to the kernel's user/kernel header split covered here in-detail)
  27. Click the # Symbols tab
  28. Click Add...
  29. Set the name to __KERNEL__
  30. Set the value to 1 and click OK
  31. Click the Source Location tab
  32. Click the plus sign (or arrow/triangle) next to your project name.
  33. Select the Filter item and click Edit Filter...
  34. Click Add Multiple... and then select all of the arch/* directories in your kernel source that will not be used (i.e. all the ones that are not for the architecture you are using)
  35. Click OK and OK again to dismiss that dialog.
  36. Under C/C++ General, select Preprocessor Include Paths, Macros etc.
  37. Click the Providers tab and select CDT GCC Built-in Compiler Settings
  38. Uncheck Use global provider shared between projects
  39. Append -nostdinc to the curretly-existing Command to get compiler specs. The kernel is a free-standing environment by ISO C99 definition. That is, it does not want to be polluted, and obviously cannot work with, the "host" header files and libraries.
  40. Open a terminal, and type "echo -iwithprefix $(gcc --print-file-name include/)". Append the resulting output to the Command to get compiler specs mentioned above. Rationale is, -nostdinc asked gcc to not search the standard system directories for header files. But the Linux Kernel depends on GCC-provided "freestanding environment" headers like stdarg.h, stdbool.h, etc., and which are typically hosted by GCC under /lib/gcc/<arch>/<version>/include. Thus the append.
  41. Check Allocate console in the Console View so you can see that this is working
  42. Click OK on the Properties dialog.
  43. Note: If you temporarily disabled indexing as earlier recommended. This is the right time to re-enable it. Under C/C++ General, click on Indexer, and mark the Enable indexer option.
  44. Click Finish on the C Project dialog.
  45. The Project will index automatically.
  46. On a platter drive indexing will take upwards of 20 minutes to complete, on a SSD indexing will take about 5 minutes to complete.

Authored and continuously updated, from Linux v2.6.33 to Linux v5.1, by:

Based on earlier work by:

Back to the top