例如,我有以下結構,
struct thread {
char *pName;
... // number of members between may be different for different configurations
int member;
...
};
對于不同的配置,pName和之間可能有不同的成員member,因此member不同配置的偏移量是不一樣的。而且我想member在匯編代碼中使用's offset ,但不想根據不同的配置對其進行硬編碼。我試圖定義以下 C 風格的宏,但 GCC 匯編器無法識別它,
#define OFFSET (&(((struct thread*)0)->member))
有沒有其他方法可以做到這一點?
uj5u.com熱心網友回復:
您可以撰寫作為構建步驟呼叫的腳本來創建檔案 offsets.h。
最大的困難是從頭檔案中提取結構名稱和成員名稱。下面的例子使用一個非常簡單的頭檔案和一個非常簡單的 awk 腳本來獲取名稱,只是為了展示這個想法。一個真正的實作將取決于頭檔案的復雜程度以及您的決議器需要的健壯程度。如果頭檔案中的結構定義具有非常一致的布局,那么它可能不會比此示例復雜得多。
這是一個完整且經過充分測驗的示例。
生成檔案
a.out: main.o asm.o
cc main.o asm.o
demo_offsets.h: demo.h
sh make_offsets.sh $<
main.o : demo.h
asm.o: demo_offsets.h
make_offsets.sh
set -e
tmp=make_tmp$$
cat << EOF > $tmp.c
#include <stdio.h>
#include <stddef.h>
#include "$1"
int main()
{
`awk -f awkfile $1`
}
EOF
cc -o $tmp $tmp.c
$tmp > $(basename ${1} .h)_offsets.h
rm $tmp.c $tmp
檔案
/struct/ { s=$2 }
/[A-Za-z_];/ { m=gensub(".*([A-Za-z_]*);", "\\1", 1); printf "printf(\"#define %s_%s_offset %%lu\\n\", offsetof(struct %s, %s));\n", s, m, s, m; }
演示檔案
struct demo {
int x;
int y;
};
主檔案
#include "demo.h"
extern int f(const struct demo *);
int main()
{
struct demo s = { 1, 2 };
return f(&s);
}
匯編
#include "demo_offsets.h"
.global f
f:
mov demo_x_offset(%rdi),
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/384830.html
