首页 文章

动态链接库中的char *类型的函数参数(dll / so)

提问于
浏览
1

我编译了一个特定于供应商的OpenGL Headers ,用于使用特定于硬件的静态库进行编译,但我使用nVidia Quadro 4000卡和库(linux)进行链接和运行 . 这就是我们的供应商说我们应该在主机环境中这样做,所以不用担心 .

我找到了一些奇怪的东西 . 特定于供应商的 Headers 将GLchar typedeffed作为'unsigned char'(叹息......),而nVidia Headers 类型将其设置为'char' . 这些类型不一样,但它仍然“有效” . 我无法隐式地将char *转换为unsigned char *,这给了我一个编译错误,但我可以链接并成功运行可能使用'char'原型构建的函数(glGetUniformLocation)库 .

发生了什么?运行时是否通过判断'char'与'unsigned char'“足够接近”来解决它?或者在 Build 图书馆时,“char”的出现是否扩展到一个签名或另一个签名?如果是这样,如果我使用所有三种签名重载函数会发生什么?

编辑:注意OpenGL库使用C-linkage来解释我在接受的答案中描述的特定体验 .

1 回答

  • 3

    使用C链接时,函数按其文字名称链接 . 与名称为mangling的C不同,没有什么可以控制参数的类型 . 当程序调用函数时,它将参数放在堆栈或寄存器中(根据调用约定)并且函数读取它 . 指针被放(4或8字节),指针被读取(相同大小) . 调用者将指针解释为 unsigned char* ,被调用者将其解释为 char* .

    如果被调用者读取的字节多于或少于调用者放置的字节数,则堆栈将被破坏,从而导致奇怪的,不需要的行为 .

    如果在调用者输入 float 之后被调用者读取 int ,则被调用者将处理垃圾而不是敏感数据 .

相关问题