64 位内核上有哪些 __attribute__ 的替代方案?

发布于 2024-08-28 05:04:22 字数 296 浏览 9 评论 0原文

64 位内核上是否有任何替代非 ISO gcc 特定扩展 __attribute__ 的方法?

我注意到的三种类型是:函数属性、类型属性和变量属性。

例如。 我想避免使用 __attribute__((__packed__)) 作为通过网络传递的结构,即使一些基于 gcc 的代码确实使用它。

关于如何完全避免在 C 系统/内核代码中使用 __attribute__ 有什么建议或指示吗?

谢谢 赛菲。

Is there any alternative to non-ISO gcc specific extension __attribute__ on 64-bit kernels ?

Three types that i've noticed are: function attributes, type attributes and variable attributes.

eg.
i'd like to avoid using __attribute__((__packed__)) for structures passed over the network, even though some gcc based code do use it.

Any suggestions or pointers on how to entirely avoid __attribute__ usage in C systems/kernel code ?

thanks
Saifi.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

迷你仙 2024-09-04 05:04:22

关于如何完全避免在 C 系统/内核代码中使用属性有什么建议或指示吗?

您可以逐段构建网络数据包,将每个数据元素复制到 char* 缓冲区中的正确位置。

优点:没有任何对齐问题,并且通常是可移植的,特别是当您使用 中的精确宽度整数类型时

缺点:它很乏味并且可能容易出错

Any suggestions or pointers on how to entirely avoid attribute usage in C systems/kernel code?

You can build your network packets piece by piece, copying each data element into the correct place in a char* buffer.

Pros: you don't have any alignment issues and it's generally portable, especially if you use the exact-width integer types from <stdint.h>

Cons: it's tedious and potentially error-prone

尘曦 2024-09-04 05:04:22

根据您的评论,我假设您想要更改的是您的代码,而不是整个 Linux 内核(等)。

不确定函数属性等,但特别是对于属性打包,我已经完成了以下操作,到目前为止没有任何问题。

基本上,您可以使用手动填充字段与编译时断言相结合,而不是依赖编译器来打包。

struct foo {
   u32 field1;
   u16 field2;
   u16 pad; // manual padding
   // continue for other fields that the compiler would automatically pad for you with attribute packed
   u32 field3;
};

要检查您的结构,您可以使用编译时断言,如下所示:

#define CASSERT(cond, name) typedef cassert__##name[cond ? 1 : -1]

CASSERT(offsetof(foo, field1) == 0, field1_wrong);
CASSERT(offsetof(foo, field2) == 4, field2_wrong);

当您的断言错误时,构建将失败,并显示有用的错误和行号

I'm assuming based on your comments that its your code you want to change, not the whole Linux kernel (etc).

Not sure about function attributes etc but specifically for attribute packed, I have done the following with no issues so far.

Basically instead of relying on the compiler to pack, you could use manual pad fields coupled with compile-time asserts.

struct foo {
   u32 field1;
   u16 field2;
   u16 pad; // manual padding
   // continue for other fields that the compiler would automatically pad for you with attribute packed
   u32 field3;
};

To check your structure you can use a compile time assert, something like this:

#define CASSERT(cond, name) typedef cassert__##name[cond ? 1 : -1]

CASSERT(offsetof(foo, field1) == 0, field1_wrong);
CASSERT(offsetof(foo, field2) == 4, field2_wrong);

When your assertions are wrong, the build will fail with a helpful error and line number

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文