Le 2022-09-21 08:18, Stefan Kalkowski a écrit :

Hello Jean-Adrien,

On Tue, Sep 20, 2022 at 05:41:50PM +0200, Jean-Adrien Domage wrote:
/tmp/ccOLpMJW.s: Assembler messages:
/tmp/ccOLpMJW.s:987: Error: section name '__irqchip_of_table' already
defined as another symbol
```

This error message indicates a rather obvious error: It seems the symbol
with that name is defined twice with different 'type' in different
compilation units.

However, when using grep I can find the symbol within
`repos/dde_linux/src/lib/lx_emul/spec/arm/irqchip.c` but it is not that
clear within the Linux source where it is defined. I assume in a linker
script but I'm not sure at all. I couldn't find it using grep (not event a
declaration, maybe some macro magic happen here). Which let me think that
the error might not be due to what I actually think...

In general, you might find the compilation unit that already contains
the symbol of the Linux kernel by applying `find` to all object files
of your target, and by combining `nm` and `grep` to find the
locations. You can use the flag `--print-file-name` when calling `nm`
to include the corresponding filename in every match.

In the concrete case, I assume it is a combination of macros, like
`IRQCHIP_DECLARE`, and the ones it depends on.
Probably you've included a Linux kernel source file with interrupt
controller definitions, which is in most cases not a good idea.

Best regards
Stefan

Dear Genodians,

Thank you, everyone! I appreciate all of your answers!
I'm now able to compile everything with dummies, without assembler errors. Here is my story:

 I tried with nm and grep on each generated object in the build directory but couldn't find the culprit either.

I couldn't find the symbol with nm & grep before, as I followed the article from Stefan [1]. I shot myself in the foot because I forgot to remove `...| grep -i " t " |...` from the command line. Then I proceeded by eliminating every file referencing `__irqchip_of_table` which as led me to `repos/dde_linux/src/lib/lx_emul/spec/arm/irqchip.c` again.

[1] https://genodians.org/skalk/2021-04-08-dde-linux-experiments-1

With your help, I finally figured it out:

In the concrete case, I assume it is a combination of macros, like
`IRQCHIP_DECLARE`, and the ones it depends on.
Probably you've included a Linux kernel source file with interrupt
controller definitions, which is in most cases not a good idea.

1. As suggested by Stefan, I paid attention not to do so. Only `lx_emul/../irqchip.c` made uses of `IRQCHIP_DECLARE`. To ensure that, commenting out this file from the `target.mk` made the error go away. But I do need it eventually.

2. I suspected a macro expansion from a Linux header to be the culprit. I added `CC_OPT += -S -save-temps=obj` to both `target.mk` of my mmc and sd_card drivers. The build may fail with lots of errors, but I can now compare the `irqchip.i` from mmc/ and sd_card/

The result for mmc is:
```
static const struct of_device_id __of_table_dde_gic_v3 ... __attribute__((__section__("__" "irqchip" "_of_table"))) __attribute__((__aligned__(__alignof__(struct of_device_id)))) = ...
```
Which is probably not what I want. Note how the attribute section is set `__section__("__" "irqchip" "_of_table")` which makes it not friendly to grep for.

For the sd_card driver, I obtain:
```
static void __of_declare_initcall_dde_irqchip_initdde_gic_v3(void)__attribute__((constructor)); static void __of_declare_initcall_dde_irqchip_initdde_gic_v3() { lx_emul_register_of_irqchip_initcall( ...
```

3. With our Linux source tree, something goes wrong when `IRQCHIP_DECLARE` expands. It does not result in an init_call registration, It turns out that `of.h` was missing from the shadow include path xD ...

Thank you very much!

Cheers,
Jean-Adrien

---
Jean-Adrien Domage
gapfruit AG
Operating System Engineer