【问题标题】:Function parameter of char* type in dynamically linked library (dll/so)动态链接库(dll/so)中char*类型的函数参数
【发布时间】:2016-04-14 18:10:55
【问题描述】:

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

我发现了一些奇怪的东西。供应商特定的标头将 GLchar 类型化为“无符号字符”(叹气...),而 nVidia 标头将其类型化为“字符”。这些类型不一样,但它仍然“有效”。我不能将 char* 隐式转换为 unsigned char*,这会给我一个编译错误,但我可以链接并成功运行可能使用“char”原型构建的函数 (glGetUniformLocation) 库。

发生了什么?运行时是否通过确定“char”与“unsigned char”“足够接近”来解决它?或者在构建库时是否将“char”的出现扩展到一种或另一种符号?如果是这样,如果我重载具有所有三种符号的函数会发生什么?

编辑:注意 OpenGL 库使用 C-linkage,它解释了我在接受的答案中描述的特殊体验。

【问题讨论】:

    标签: c++ c opengl linker


    【解决方案1】:

    当您使用 C 链接时,函数通过其文字名称链接。与名称修饰的 C++ 不同,没有任何东西可以控制参数的类型。当您的程序调用函数时,它会将参数放在堆栈或寄存器中(根据调用约定),然后函数读取它。放置指针(4 或 8 个字节),读取指针(大小相同)。调用者将指针解释为unsigned char*,被调用者将其解释为char*

    如果被调用者读取的字节多于或少于调用者放置的字节,堆栈将被破坏,从而导致奇怪的、不受欢迎的行为。

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

    【讨论】:

    • 哦,对了。我忘记了 OpenGL 库正在使用 c 链接。
    • @Andreas 啊,很高兴您了解发生了什么。我已经添加了一些对你来说可能很明显的注释。
    猜你喜欢
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多